Azure Durable Function Eternal Orchestrations 是否会在 ContinueAsNew 后立即重启?

Does Azure Durable Function Eternal Orchestrations restart immediately after ContinueAsNew?

我读到有关 Eternal Orchestration here 的内容,我们可以通过调用 ContinueAsNew 来重置其状态,从而使 orchestrator 运行“无限”。

协调器是否立即重新运行?或仅在完成函数中的所有语句后(即,根据下面的代码,当 if 条件 满足或它是否中断时,“函数结束”才会注销函数并重新执行协调器?)?

[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
{
    await context.CallActivityAsync("DoCleanup", null);

    // sleep for one hour between cleanups
    DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
    await context.CreateTimer(nextCleanup, CancellationToken.None);

    if (condition)
       context.ContinueAsNew(null);

    log.logInformation("End of the function");
}

谢谢!

执行将始终完成,直到函数结束或直到 运行出现某些错误。这意味着您会看到“函数结束”被记录下来。如果你有很多 ContinueAsNew 只有最后执行的将 运行 当函数终止时。实际上,您可以在使用 ContinueAsNew

之后执行任何操作

例如

        [FunctionName("Orch")]
        public static async Task Orchestrator(
        [OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
        {
            int input = context.GetInput<int>();

            await context.CallActivityAsync<string>("Acti", input.ToString());

            context.ContinueAsNew(input + 1);

            context.ContinueAsNew(input + 2);

            await context.CallActivityAsync<string>("Acti", input.ToString() + " : second");

            log.LogInformation("End of the function");
        }

        [FunctionName("Acti")]
        public static async Task Activity(
        [ActivityTrigger] IDurableActivityContext inputs, ILogger log)
        {
            log.LogInformation(inputs.GetInput<string>());
        }

这会记录。

0
0 : second
End of the function
2
2 : second
End of the function
4
4 : second
End of the function
...

context.ContinueAsNew 真正做的只是告诉编排上下文在函数终止时启动具有相同 InstanceId 的新编​​排器。在代码中的某处使用 ContinueAsNew 与将 context.StartAsNew("Orch", /*random instanceId*/, input) 放在函数的绝对末尾“几乎”相同。唯一的区别是,当函数终止时,StartAsNew 将开始在 TableStorage 中创建新的执行历史记录,但 ContinueAsNew 将重用相同的历史记录,这可能会减少一些故障排除选项,但会节省存储空间。