Очередь Azure ServiceBus не повторяет сообщения при возникновении исключения TaskCanceledException - PullRequest
5 голосов
/ 07 апреля 2019

У меня есть функция веб-задания Azure, которая прослушивает сообщения в очереди Azure ServiceBus. Обычно, когда я сталкиваюсь с исключением в моем коде, сообщение прекращается в соответствии с документацией Azure WebJobs SDK :

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

В соответствии с документацией Azure ServiceBus это должно означать, что сообщение снова станет доступным и будет повторено:

Если приложение по какой-то причине не может обработать сообщение, оно может вызвать метод AbandonAsync для полученного сообщения (вместо CompleteAsync). Этот метод позволяет служебной шине разблокировать сообщение и сделать его доступным для повторного получения тем же потребителем или другим конкурирующим потребителем. Во-вторых, есть тайм-аут, связанный с блокировкой, и если приложению не удается обработать сообщение до истечения времени ожидания блокировки (например, в случае сбоя приложения), то служебная шина разблокирует сообщение и делает его доступным для повторного приема (по существу выполнение операции AbandonAsync по умолчанию).

Поведение, описанное выше, обычно происходит, но я нашел исключение из этого правила. Если мой код выбрасывает TaskCanceledException, сообщение не прекращено, как следует:

public void ProcessQueueMessage([ServiceBusTrigger("queue")] BrokeredMessage message, TextWriter log)
{
     throw new TaskCanceledException();
}

При запуске этой функции через веб-задание я вижу сообщение об ошибке, распечатанное как день, но сообщение используется без повторных попыток и без входа в очередь недоставленных сообщений. Если я заменю TaskCanceledException выше на InvalidOperationException, сообщение будет удалено и повторено, как и должно (я проверил это по фактической очереди ServiceBus).

Мне не удалось найти объяснения этому поведению. В настоящее время я обертываю TaskCanceledException в другое исключение, чтобы обойти проблему.

Вопрос

В чем проблема с SDK Azure WebJobs? Является ли TaskCanceledException особенным в этом отношении, или другие типы исключений имеют аналогичное поведение?


Я использую следующие пакеты NuGet:

  • Microsoft.Azure.WebJobs 2.3.0
  • Microsoft.Azure.WebJobs.ServiceBus 2.3.0

1 Ответ

0 голосов
/ 07 апреля 2019

Функции должны отказаться от сообщения, если выполнение не было успешным. Если вы говорите, что сообщение не было оставлено и повторено, даже если оно должно быть (при условии, что MaxDeliveryCount было установлено больше 1 и режим приема был PeekLock), то, скорее всего, это проблема с функциями, а не Сервисный автобус Azure. Вы можете проверить это, запустив консольное приложение и выполнив то же самое, проверив, где сообщение завершено и удалено из очереди или все еще находится в очереди и доступно для использования.

Кроме того, похоже, что вы используете более старую версию WebJobs (и Azure Service Bus). При выполнении проверки вам потребуется использовать старый клиент Azure Service Bus ( WindowsAzure.ServiceBus ), а не новый ( Microsoft.Azure.ServiceBus ).

...