Azure Durable Function - счетчик в оркестровке - PullRequest
0 голосов
/ 23 апреля 2019

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

[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 Ответ

2 голосов
/ 26 апреля 2019

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

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

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

...