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