Как реализовать экспоненциальный откат в функциях Azure? - PullRequest
0 голосов
/ 12 июня 2018

Как реализовать экспоненциальный откат в функциях 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;
    }
}

К сожалению, это решение слабое, поскольку у него нет контекста (я не знаю, какая попыткаэто и по этой причине я не могу ограничить количество вызовов и изменить время (экспоненциальный откат)).

Внутренняя политика повторных попыток также не приветствуется, поскольку она может резко увеличить затраты (модели ценообразования).

1 Ответ

0 голосов
/ 12 июня 2018

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

В качестве альтернативы вы могли бы переместить начальную точку процесса на приложения логики, так как это также может вызывать сообщения очереди (считайте связанными).В любом случае Logic Apps добавляет возможность приостановки и повторного вызова функции и / или процесса.

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