Функция Azure Durable — счетчик в оркестровке

#c# #azure #azure-functions #azure-durable-functions

#c# #azure #azure-функции #azure-durable-функции

Вопрос:

Я создаю надежную функцию на основе шаблона монитора. У меня есть приведенный ниже код, и мой вопрос касается переменной counter, которую я использовал для простого экспоненциального возврата к повторной попытке.

 [FunctionName("RequestOrchestrator")]
public static async Task RequestOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext monitorContext, ILogger log)
{
    DateTime endTime = monitorContext.CurrentUtcDateTime.AddHours(1);
    int counter = 0;

    while (monitorContext.CurrentUtcDateTime < endTime)
    {
        var result = await monitorContext.CallActivityAsync<bool>("GetStatusExternal", "test");

        if (result)
        {
            // all ok
            break;
        }
        else
        {
            counter  ;
            // Wait for the next checkpoint with exponential backoff
            var nextCheckpoint = monitorContext.CurrentUtcDateTime.AddSeconds(5 * counter);
            if (!monitorContext.IsReplaying)
            {
                log.LogInformation($"Next check at {nextCheckpoint}.");
            }

            await monitorContext.CreateTimer(nextCheckpoint, CancellationToken.None);
        }
    }
}
  

Нормально ли использование счетчика таким образом или counter нужно перейти в

 if (!monitorContext.IsReplaying)
  counter  ;
  

чтобы это было безопасно для воспроизведения?

Ответ №1:

Нет. Вам не нужна monitorContext.IsReplaying проверка вокруг counter .
Вам нужна эта проверка только для инструкций, которые вы хотите запустить только один раз, таких как ведение журнала (как в вашем коде), обновления статуса во внешней системе и т.д.

Чтобы быть безопасным для воспроизведения, вам просто нужно, чтобы ваш код был детерминированным. Таким образом, любой код, который не может быть создан в чистой функции, должен быть перемещен в их собственные функции activity. Все остальное подойдет.

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

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

1. спасибо за объяснение! Итак, способ, которым я использую счетчик для экспоненциального отката, действительно в порядке?!

2. ДА. Это правильно. Возможно, вам захочется установить верхний предел времени ожидания в зависимости от вашего варианта использования.