Как определить приоритет исходящих сообщений с помощью WCF

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

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

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

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

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

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


person Simon Gillbee    schedule 09.08.2010    source источник


Ответы (2)


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

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

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

person Ladislav Mrnka    schedule 10.08.2010

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

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

person Simon Gillbee    schedule 25.08.2010