Azure Durable Functions, неожиданное значение флага IsReplaying - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь понять поведение Azure Durable Functions. В частности, о том, как воспроизводится функция Orchestrator. Я думал, что освоился, пока не нашел одно значение флага Context.IsReplaying, которое не имело для меня смысла.

Мой код очень "привет мир" -i sh. У него есть функция Orchestrator, которая вызывает две функции Activity одну за другой.

[FunctionName("OrchestratorFn")]
    public static async Task<object> Orchestrator(
        [OrchestrationTrigger] IDurableOrchestrationContext context,
        ILogger log
        ) {
        log.LogInformation($"--------> Orchestrator started at {T()}, isReplay={context.IsReplaying}");

        string name = context.GetInput<string>();

        string name1 = await context.CallActivityAsync<string>("A_ActivityA", name);
        string name2 = await context.CallActivityAsync<string>("A_ActivityB", name1);

        log.LogInformation($"--------> Orchestrator ended at {T()}, isReplay={context.IsReplaying}");

        return new {
            OutputFromA = name1,
            OutputFromB = name2
        };
    }


    [FunctionName("A_ActivityA")]
    public static async Task<object> ActivityA(
        [ActivityTrigger] string input,
        ILogger log
        ) {
        log.LogInformation($"--------> Activity A started at {T()}");

        await Task.Delay(3000);
        log.LogInformation($"--------> Activity A ended at {T()}");

        return input + "-1";
    }


    [FunctionName("A_ActivityB")]
    public static async Task<object> ActivityB(
        [ActivityTrigger] string input,
        ILogger log
        ) {
        log.LogInformation($"--------> Activity B started at {T()}");

        await Task.Delay(3000);
        log.LogInformation($"--------> Activity B ended at {T()}");

        return input + "-2";
    }

В выводе консоли (я вырезал все, кроме вывода, где я регистрирую время), вот что я вижу:

[1/26/2020 12:56:40 PM] ------> DurableClient Function Running at 56.40.8424.
[1/26/2020 12:56:49 PM] ------> DurableClient Function END at 56.49.5029.
[1/26/2020 12:57:03 PM] ------> Orchestrator started at 57.03.7915, isReplay=False
[1/26/2020 12:57:04 PM] ------> Activity A started at 57.04.1905
[1/26/2020 12:57:07 PM] ------> Activity A ended at 57.07.2016
[1/26/2020 12:57:24 PM] ------> Orchestrator started at 57.24.8029, isReplay=True
[1/26/2020 12:57:40 PM] ------> Activity B started at 57.40.4136
[1/26/2020 12:57:43 PM] ------> Activity B ended at 57.43.4258
[1/26/2020 12:57:53 PM] ------> Orchestrator started at 57.53.1490, isReplay=True
[1/26/2020 12:57:59 PM] ------> Orchestrator ended at 57.59.0736, isReplay=False

Это «isReplay = False» в самой последней строке, которое я не могу объяснить. Почему это ? Разве isReplay не должен иметь значение «True»?

Я использую Microsoft. Azure .WebJobs.Extensions.Durable v2.1.1

1 Ответ

1 голос
/ 26 января 2020

Нет, это не должно быть isReplay=true, потому что эта строка действительно выполняется только один раз. Всякий раз, когда Orchestrator await вызывает какой-либо вызов, он тут же останавливает собственное выполнение и ожидает этого вызова до fini sh. Когда это происходит, он снова проходит через весь код вплоть до своей последней точки - без повторных исходящих вызовов.

Поскольку после вашего последнего оператора записи больше нет await, эта строка достигается только один раз.

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