Сервисная шина Azure: одновременно обрабатывается несколько клиентов, но обрабатывается только одно сообщение.

Я пытаюсь оценить, соответствует ли служебная шина Azure моим требованиям.

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

Поэтому, если приходит сообщение A и клиент 1 начинает его обрабатывать, то, если приходит сообщение B, я не хочу, чтобы клиент 2 начинал его обрабатывать, пока клиент 1 не закончил.

Я понимаю, что могу достичь этого, только слушая 1 клиента. Другой вариант - посмотреть на идентификатор экземпляра и запустить прослушиватель, только если идентификатор экземпляра = 0, но я подумал, есть ли способ избежать этой логики, связанной с идентификатором экземпляра.

1 ответ

Решение

Вы можете добиться этого, используя сеансы через очередь служебной шины. С точки зрения отправителя вы можете добавить строковое свойство SessionId к каждому сообщению и указать, к какому сеансу они относятся. На стороне получателя вы вызываете AcceptMessageSession и по существу блокируете весь сеанс. Любые сообщения, которые появятся для этого сеанса позже, будут доставлены только получателю, у которого сеанс заблокирован тем, что они вызвали прием. Другие клиенты также могут вызывать AcceptMessageSession в очереди, но говорят, что если все сообщения были в одном сеансе (у всех был один и тот же идентификатор сеанса), то только один из получателей мог бы его увидеть. Образцы сессий доступны здесь: http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Session-41c43fb4

Сценарий, который вы описываете, не ясен относительно цели, поэтому изучите аренду BLOB-объектов хранилища Azure и т. Д., Поскольку они могут решить ту же семантику блокировки, что и вам.

Другие вопросы по тегам