У меня есть функция Azure, которая запускается очередью служебной шины. Если функция завершается сбоем, она немедленно повторяется (через 1 с) до 10 раз. Однако я хотел бы повторять попытку каждые пять минут. Даже после прочтения документации мне было неясно, как это должно быть реализовано.
[Function("Foo")]
public async Task Run(
ServiceBusTrigger("FooQueue",
Connection = "ServiceBusConnection")]
Foo foo,
int deliveryCount,
DateTime enqueuedTimeUtc,
string messageId)
В документации говорится, что поведение повторной попытки можно настроить в файле host.json
. Однако там также говорится, что настройки clientRetryOptions применяются только к взаимодействию со службой служебной шины. Они не влияют на повторные попытки выполнения функций.
При этом я не нашел в очереди служебной шины настройки, с помощью которой можно настроить поведение повтора.
Каков «официальный» способ реализации стратегии повторных попыток? Предполагается ли это реализовать в самой функции, используя задержки типа Task.Delay
вместе с параметром DeliveryCount
?
Как вы уже узнали, триггер служебной шины может выполнять немедленные повторные попытки только с помощью MaxDeliveryCount
. Отложенные повторы не поддерживаются ни пакетом SDK для функций, ни служебной шиной Azure.
Для отложенных повторных попыток с функциями изолированного Worker SDK вы можете реализовать собственное решение, доступное с помощью опции промежуточного программного обеспечения, которую поддерживает новый Functions SDK. Я изложил эту идею в блоге . Версия TLDR предназначена для использования счетчика доставки для немедленных повторных попыток и выдачи клонированного сообщения для отложенных повторных попыток, используя заголовки сообщений для отслеживания повторных попыток.