Кластер Service Fabric. Statefull-сервис. Использование очереди служебной шины

Полное раскрытие: я новичок в разработке Service Fabric. Вот моя ситуация. У нас есть кластер Service Fabric. Мы развернули там сервис с отслеживанием состояния. Служба назначила очередь служебной шины, которую она прослушивает. Таким образом, все экземпляры служб на всех узлах кластера прослушивают одну и ту же очередь служебной шины. Каждый экземпляр службы регистрирует обратный вызов OnMessage в очереди служебной шины для обработки следующего сообщения:

  QueueClient Queue = QueueClient.CreateFromConnectionString(
                                 GetServicebusConnectionString(), 
                                 ConfigData.SERVICE_QUEUE_NAME);
   if (Queue != null)
   {
       var options = new OnMessageOptions();
       options.AutoComplete = false;

       Queue.OnMessage((receivedMessage) => 
                          ProcessMessage(receivedMessage), options);
   }

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

Можно ли использовать очередь служебной шины таким образом, чтобы каждое сообщение из очереди принималось только одним экземпляром службы?


person fatherOfWine    schedule 09.05.2017    source источник


Ответы (1)


режим приема по умолчанию клиента очереди - PeekLock, и вы устанавливаете для свойства AutoComplete значение false, которое не будет автоматически удалять сообщение после того, как клиент получит сообщение. По истечении срока блокировки сообщение снова станет доступным, и другие экземпляры службы смогут снова его получить и обработать.

Можно ли использовать очередь служебной шины таким образом, чтобы каждое сообщение из очереди принималось только одним экземпляром службы?

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

Queue.OnMessage((receivedMessage) =>
                { ProcessMessage(receivedMessage); receivedMessage.Complete(); }, options);
person Fei Han    schedule 10.05.2017
comment
Что ж, это была моя штора. Я вызывал метод Abandon, думая, что он отправит сообщение в очередь недоставленных сообщений. :) Когда я переключился на метод Deadletter, все волшебным образом снова начало обретать смысл. Спасибо, что помогли мне встать на правильный путь. - person fatherOfWine; 11.05.2017