Обработка сообщений служебной шины по порядку (без одновременных вызовов) в функции Azure - PullRequest
0 голосов
/ 09 мая 2018

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

Для этого я использую триггер служебной шины функции Azure (это единственный подписчик в очереди). В соответствии с документацией я установил для параметра «servicebus / maxConcurrentCalls» (в host.json) значение 1. Кроме того, я украсил функцию атрибутом «Singleton». Помимо всего этого сообщения, кажется, обрабатываются в случайном порядке различными потоками. Что мне здесь не хватает? Или я что-то не так понял?

Документация, которую я использовал: https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton

host.json:

{
  "serviceBus": {
    "maxConcurrentCalls": 1
  }
}

Функция Azure:

using System;
using System.Threading.Tasks;
using Microsoft.ServiceBus.Messaging;

[Singleton]
public static void Run(BrokeredMessage myQueueItem, TraceWriter log)
{
    Stream stream = myQueueItem.GetBody<Stream>();
    StreamReader reader = new StreamReader(stream);
    string messageContentStr = reader.ReadToEnd();

    log.Info($"New TEST message: {messageContentStr} on thread {System.Threading.Thread.CurrentThread.ManagedThreadId}");   

    System.Threading.Thread.Sleep(2000);     
}

Вот выдержка из журнала. Как видите, есть разные темы. И, например, «Сообщение 19» предшествует «Сообщение 10». И да, я уверен, что поставил сообщения в правильном порядке в очереди.

....
2018-05-09T09:09:33.686 [Info] New TEST message: Message 19 on thread 33
2018-05-09T09:09:35.702 [Info] Function completed (Success, Id=007eccd0-b5db-466a-91c1-4f53ec5a7b3a, Duration=2013ms)
2018-05-09T09:09:36.390 [Info] Function started (Id=b7160487-d10d-47a6-bab3-78da68a93498)
2018-05-09T09:09:36.420 [Info] New TEST message: Message 10 on thread 39
...

1 Ответ

0 голосов
/ 09 мая 2018

Посмотрите и убедитесь, что ваша очередь служебной шины НЕ разделена. Если он разделен, у вас есть несколько брокеров сообщений, обслуживающих запросы, и порядок обмена сообщениями не гарантируется. Подробнее об этом вы можете прочитать здесь: https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning#not-using-a-partition-key

В частности:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...