Как получить сообщения очереди служебной шины Azure не в порядке FIFO?

#azure-functions #azureservicebus #azure-servicebus-queues #azure-function-async

Вопрос:

У меня есть следующая функция Azure, запускаемая Http, для отправки данных в очередь. Но как я могу увидеть поведение, при котором служебная шина Azure не гарантирует порядок FIFO?

Я использую поведение приема с прищуром. Предполагая, что у меня есть сообщения 1,2,3,4 в очереди. Если мое приложение потерпело неудачу при получении сообщения 1, как реагирует функция Azure из-за ее параллелизма? Будет ли другой поток, который читает сообщение 2 во время тайм-аута сообщения 1?

         [FunctionName("ServiceBusFunction")]
        public static void Run([ServiceBusTrigger("testQueueDuplicateDetection")] string myQueueItem, ILogger log)
        {
            log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        }

        [FunctionName("ServiceBusOutput")]
        [return: ServiceBus("testQueueDuplicateDetection")]
        public static string ServiceBusOutput([HttpTrigger] string input, ILogger log)
        {
            log.LogInformation($"C# function processed: {input}");
            return input;
        }
 

Заранее спасибо!

Ответ №1:

Но как я могу увидеть поведение, при котором служебная шина Azure не гарантирует порядок FIFO?

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

Чтобы сделать это, нам нужно было бы пожертвовать многопоточным / многопроцессным способом ввода сообщений (Fan-In) и вместо этого использовать подход с одним издателем. Аналогичным образом, на стороне обработки сообщений мы не можем гарантировать потокобезопасный подход к обработке сообщений без использования подхода с одним Подписчиком, тем самым жертвуя преимуществами масштабируемости подхода с разветвлением.

Каждый из этих вариантов уменьшит богатые возможности служебной шины Azure, снизив мощность настоящей архитектуры служебной шины.

Вы можете перейти по этой ссылке для получения дополнительной информации.

У меня в очереди есть сообщения 1,2,3,4. Если мое приложение потерпело неудачу при получении сообщения 1, как реагирует функция Azure из-за ее параллелизма? Будет ли другой поток, который читает сообщение 2 во время тайм-аута сообщения 1?

На основе документации azure среда выполнения функций получает сообщение в режиме скрытой блокировки. Он вызывает Complete сообщение, если функция успешно завершается, или вызывает Abandon , если функция завершается неудачно.

Если функция работает дольше PeekLock установленного времени ожидания, блокировка автоматически продлевается до тех пор, пока функция работает.

Комментарии:

1. Могу ли я еще раз проверить, можно ли гарантировать FIFO, как уже упоминалось, с помощью сеансов, в контексте параллелизма функций Azure.

2. Да, FIFO может быть гарантирован в служебной шине с помощью сеансов. Вы можете проверить эту ссылку — docs.microsoft.com/en-us/azure/service-bus-messaging/…