В настоящее время я занимаюсь созданием эталонной архитектуры для распределенной системы на основе событий, в которой события хранятся в базе данных SQL Server Azure с использованием простых старых таблиц (без SQL Server Service Broker).
События будут обрабатываться с использованием рабочих ролей, которые будут опрашивать очередь на предмет новых сообщений о событиях.
В своем исследовании я вижу ряд решений, которые позволяют нескольким процессорам обрабатывать сообщения вне очереди. Проблема, с которой я сталкиваюсь с множеством наблюдаемых мной паттернов, - это дополнительная сложность управления блокировками и т. Д., Когда несколько процессов пытаются получить доступ к единой очереди сообщений.
Я понимаю, что традиционный шаблон очереди состоит в том, что несколько процессоров извлекают из одной очереди. Однако, предполагая, что сообщения о событиях могут обрабатываться в любом порядке, есть ли причина не просто создавать взаимно-однозначные отношения между очередью и ее обработчиком очереди и просто балансировать нагрузку между разными очередями?
queue_1 => processor_1
queue_2 => processor_2
Эта реализация позволяет избежать всех подключений, необходимых для управления одновременным доступом к очереди через несколько процессоров. Издатель событий может использовать любой алгоритм балансировки нагрузки, чтобы решить, в какую очередь публиковать сообщения.
Тот факт, что я не вижу такой реализации ни в одном из своих поисков, заставляет меня думать, что я не замечаю серьезного недостатка в этом дизайне.
Изменить
Этот пост вызвал дискуссию об использовании таблиц базы данных в качестве очередей по сравнению с MSMQ, очередями Azure и т. Д. Я понимаю, что мне доступен ряд собственных вариантов организации очередей, в том числе устойчивые буферы сообщений в Azure AppFabric. Я оценил свои варианты и решил, что таблиц SQL Azure будет достаточно. Цель моего вопроса состояла в том, чтобы обсудить использование нескольких процессоров против одной очереди по сравнению с одним процессором на очередь.