Как расставить приоритеты исходящих сообщений с WCF - PullRequest
1 голос
/ 09 августа 2010

Я хотел бы иметь возможность расставить приоритеты исходящих данных / сообщений из службы WCF.

Вот основной сценарий:

  1. Клиент запрашивает у сервера поток данных. Поток данных живой, большой и потенциально бесконечный (данные мониторинга оборудования). Мы назовем это HighPriorityDataStream.
  2. Клиент запрашивает дополнительные данные. Мы назовем это LowPriorityData.

Пропускная способность ограничена (например, коммутируемый модем или спутник). Очень важно, чтобы текущий HigPriorityDataStream не прерывался или не задерживался при выполнении запроса для LowPriorityData.

У меня уже есть унаследованная система на основе сокетов, где это достигается путем ручного управления порядком размещения данных в буфере сокетов. Данные с высоким приоритетом помещаются в буфер, и если осталось место, данные с более низким приоритетом добавляются для заполнения оставшейся части буфера.

Я пытаюсь перестроить этот процесс с помощью WCF ... Я не знаю каких-либо готовых решений и думаю, что мне может понадобиться написать собственное поведение канала, но я бы хотел выбрать мозги сообщества, прежде чем я пойду по этому пути:)

Ответы [ 2 ]

0 голосов
/ 26 августа 2010

После долгих раздумий (спасибо, Ладислав, за ваши вдумчивые идеи) я пришел к выводу, что прошу коммуникационный уровень решить проблему бизнес-уровня. Чтобы лучше сформулировать проблему, существует несколько соединений и один источник данных. Источник данных должен установить приоритетность данных, которые он собирает из своих собственных источников данных (потоков данных в реальном времени, а также постоянных баз данных), и отправлять данные обратно различным клиентам в зависимости от их приоритета. Чтобы было понятно, клиенты имеют относительный приоритет на основе их ролевой идентичности, источники данных имеют приоритет (предпочитают живые данные, а не постоянные данные), а отдельные поля в источнике данных имеют порядок приоритетов (при прочих равных, поле X всегда должен быть отправлен перед полем Y).

Это все твердо бизнес-логика и решение, которое мы приняли в качестве набора очередей приоритетов, которые автоматически сортировали элементы входных данных на основе этих требований приоритетов и затем обрабатывали каждый запрос в этом порядке.

0 голосов
/ 10 августа 2010

Я думаю, что нет общего готового решения. Решение зависит от ваших других требований. Вы хотите контролировать пропускную способность для каждого клиента или для всего сервера (всех клиентов)? Вы хотите вызвать операцию с низким приоритетом с того же прокси-сервера или запустить новый прокси-сервер для новой операции? Вы хотите выполнять более высокоприоритетные операции одновременно? Хотите расставить приоритеты при поступлении запросов?

Самое простое решение предполагает, что вы контролируете полосу пропускания для каждого клиента, вы повторно используете один и тот же прокси-сервер для всех вызовов, одновременно может быть выполнена только одна операция с высоким приоритетом и запросы обрабатываются в порядке FIFO. Чем просто пометить реализацию службы с помощью [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] (это должна быть настройка по умолчанию для служб, доступных через NET.TCP). Эти параметры будут повторно использовать один и тот же экземпляр службы для всех вызовов с одного и того же клиентского прокси-сервера, но одновременно будет обрабатываться только один вызов (другие будут ожидать в очереди, пока они не будут обработаны или не истечет время).

С уважением, Ладислав

...