Пакетные сообщения в WCF? - PullRequest
1 голос
/ 13 февраля 2009

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

  1. Приходит сообщение 1, служба WCF начинает обрабатывать сообщение
  2. Сообщения 2 и 3 поступают до завершения шага 1 обработки. Процесс 2 и 3 вместе.

Здесь, очевидно, есть несколько предположений, что мы не можем начать обработку шага 2 до завершения шага 1, но мы можем обработать несколько сообщений за один прогон.

Первоначально я думал о том, чтобы просто использовать привязку msmq, чтобы сообщения могли стоять в очереди, пока обрабатывается один пакет. Но потом я понял, что WCF будет просто доставлять каждое сообщение по одному. И я даже не уверен, подождет ли оно, пока одно сообщение не будет обработано, прежде чем извлекать следующее и обрабатывать это (возможно, в потоке?), Что было бы плохо в этом случае.

Итак, мне просто интересно, есть ли какие-нибудь рекомендации, которые кто-то может дать о том, как создать такую ​​систему с использованием WCF. спасибо!

1 Ответ

3 голосов
/ 13 февраля 2009

Максимальная пропускная способность

Решение, вероятно, заключается в том, чтобы вообще не мыслить в терминах WCF. Возможно, вам нужен конечный автомат, работающий в отдельном потоке от ServiceHost. Этот конечный автомат будет содержать, например, обтекание, очередь или аналогичный класс. Конечному автомату будет предоставлен делегат, который будет использоваться для обработки сообщений. Когда ваш WCF ServiceHost получает сообщения, он помещает сообщения в очередь, инкапсулированную в вашем автомате состояний, и это все, о чем он будет заботиться.

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

Пакетные сообщения

Конечно, вы могли бы спроектировать свой конверт обмена сообщениями (в основном, тип, который вы передаете в качестве параметра методу OperationContract), чтобы он был в основном контейнером от 1 до N сообщений. Это определенно оптимизирует доставку байтов путем минимизации количества сообщений. Однако, если одно сообщение прибудет или N сообщений прибудут одновременно, это не изменит логику, необходимую для правильной обработки этих сообщений, за исключением добавления некоторого цикла для перебора N сообщений. Тот факт, что вы готовы рассмотреть MSMQ, предполагает, что ваша парадигма обмена сообщениями уже асинхронна, и поэтому она должна хорошо работать с подходом, который я описываю для максимизации пропускной способности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...