2013-06-10 3 views
0

У нас есть требование, когда необходимо реализовать очередь, чтобы мы могли контролировать параллелизм, а не перегружать базу данных. Из мира Microsoft мы решили использовать MSMQ для хранения запросов. Планирование создания 100 очередей (1 для каждого клиента) и параллельная обработка очередей для достижения максимального параллелизма.WCF vs Windows Service: Каков рекомендуемый метод обработки нескольких очередей в MSMQ с дросселированием?

Наша основная цель проекта - разрешить только один вызов на клиента/очередь за раз и обрабатывать каждого клиента самостоятельно.

Мы застреваем в выборе правильной технологии для обработки очередей. Есть два.

  1. Создание службы .NET окна и обрабатывать несколько очередей, используя событие объекта очереди ReceiveCompleted. Здесь у нас есть возможность связать один и тот же метод с несколькими очередями. Необходимо добавить собственный код параллелизма для одиночной очереди, используя некоторую блокировку синхронизации. Reference1

  2. У вас есть несколько служб WCF с WAS для обработки каждой очереди (одна и та же копия для разных очередей, изменение только в имени очереди) и внедрение дросселирования для ограничения параллелизма для каждой службы. Похоже, только одна очередь может обрабатываться службой WCF. Reference2

Какой именно вы предлагаете? Есть ли способ лучше? Пожалуйста помогите нам!!!

ответ

0

Ваш вариант №1 проще и понятнее. Он также должен хорошо работать, если вы придерживаетесь той же схемы, что и код ссылки на ссылку MSDN. Он использует асинхронные вызовы MSMQ, которые будут обслуживаться пулом рабочих потоков. Это устраняет необходимость постоянного опроса очередей для новоприбывших сообщений и приводит к по существу нулевым вычислительным накладным расходам для незанятых очередей.

Убедитесь, что одновременно обрабатывается не более одного сообщения в очереди. Просто не вызывайте Queue.BeginReceive() в любой очереди сообщений, пока вы не завершили обработку предыдущего сообщения этой очереди. Не требуется никакого кода параллелизма.