Как реализовать экспоненциальный откат в функциях Azure?
У меня есть функция, которая зависит от внешнего API.Я хотел бы обработать недоступность этого сервиса с помощью политики повторных попыток.Эта функция запускается, когда в очереди появляется новое сообщение, и в этом случае эта политика включена по умолчанию:
Для большинства триггеров нет встроенной повторной попытки при возникновении ошибок во время функциивыполнение.Два триггера с поддержкой повторных попыток - хранилище очереди Azure и хранилище BLOB-объектов Azure.По умолчанию эти триггеры повторяются до пяти раз.После пятой повторной попытки оба триггера записывают сообщение в специальную очередь ядов.
К сожалению, повторная попытка начинается сразу после исключения (TimeSpan.Zero), и в этом случае это бессмысленно, посколькусервис, скорее всего, пока недоступен. Есть ли способ динамически изменить время, когда сообщение снова становится доступным в очереди?
Я знаю, что могу установить visibilityTimeout
( host.json reference ), но он установлен для всех очередей, и здесь я не хочу этого достичь.
Я нашел один обходной путь, но он далек от идеального решения.В случае исключения мы можем снова добавить сообщение в очередь и установить visibilityTimeout для этого сообщения:
[FunctionName("Test")]
public static async Task Run([QueueTrigger("queue-test")]string myQueueItem, TraceWriter log,
ExecutionContext context, [Queue("queue-test")] CloudQueue outputQueue)
{
if (true)
{
log.Error("Error message");
await outputQueue.AddMessageAsync(new CloudQueueMessage(myQueueItem), TimeSpan.FromDays(7),
TimeSpan.FromMinutes(1), // <-- visibilityTimeout
null, null).ConfigureAwait(false);
return;
}
}
К сожалению, это решение слабое, поскольку у него нет контекста (я не знаю, какая попыткаэто и по этой причине я не могу ограничить количество вызовов и изменить время (экспоненциальный откат)).
Внутренняя политика повторных попыток также не приветствуется, поскольку она может резко увеличить затраты (модели ценообразования).