必须在编排客户端上等待 StartNewAsync 吗?

Jep*_*ppe 1 c# azure azure-functions azure-durable-functions

我有一个 Azure 编排,其中触发编排的编排客户端引发了超时异常。

编排客户端功能只做两件事,启动两个编排,等待每个编排,正如大多数示例代码所建议的那样。

await orchestrationClient.StartNewAsync("TableOrchestrator", updates);
await orchestrationClient.StartNewAsync("ClientOrchestrator", clientExport);
Run Code Online (Sandbox Code Playgroud)

然而,据我了解,编排客户端并不是像编排功能那样的特殊功能,因此它最多只能运行10分钟。显然,我的两个编排的总运行时间很可能超过 10 分钟。

问题:

  1. 编排客户端状态是否像实际编排函数一样保存?
  2. 我是否需要等待不依赖于先前编排结果的编排?

更新制作了我的代码功能和运行时的完整示例,如下所示。

看起来,如果之后编写了代码,则启动编排将等待它,但如果编排是最后一条语句,则不会!

更新的问题:

  1. 调用 StartNewAsync() 后的任何代码都会使函数等待直到编排真正完成吗?或者例如日志语句不会触发此行为?
  2. 推荐的代码实践是否应该仅在所有其他代码执行后调用 StartNewAsync() ?

public static class testOrchestration
{
    [FunctionName("Start")]
    public static async Task Start([TimerTrigger("0 */30 * * * *", RunOnStartup = true, UseMonitor = false)]TimerInfo myStartTimer, [OrchestrationClient] DurableOrchestrationClient orchestrationClient, ILogger log)
    {
        var startTime = DateTime.Now;
        log.LogInformation(new EventId(0, "Startup"), "Starting Orchestror 1 ***");

        await orchestrationClient.StartNewAsync("Orchestrator", "ONE");
        log.LogInformation($"Elapsed time, await ONE: {DateTime.Now - startTime}");

        await Task.Delay(5000);
        log.LogInformation($"Elapsed time, await Delay: {DateTime.Now - startTime}");

        log.LogInformation(new EventId(0, "Startup"), "Starting Orchestror 2 ***");
        await orchestrationClient.StartNewAsync("Orchestrator", "TWO");
        log.LogInformation($"Elapsed time, await TWO: {DateTime.Now - startTime}");
    }


    [FunctionName("Orchestrator")]
    public static async Task<string> TestOrchestrator([OrchestrationTrigger] DurableOrchestrationContextBase context, ILogger log)
    {
        var input = context.GetInput<string>();
        log.LogInformation($"Running {input}");
        await Task.Delay(5000);

        return $"Done {input}";
    }
}
Run Code Online (Sandbox Code Playgroud)

运行它会给出以下输出:

Starting Orchestror 1 ***
Elapsed time, await ONE: 00:00:08.5445755
Running ONE
Elapsed time, await Delay: 00:00:13.5541264
Starting Orchestror 2 ***
Elapsed time, await TWO: 00:00:13.6211995
Running TWO
Run Code Online (Sandbox Code Playgroud)

sil*_*ent 6

StartNewAsync()只是安排编排器(立即)启动。等待这些调用并不意味着您的初始函数将真正等待协调器运行 - 甚至真正开始和完成其工作。

业务流程客户端绑定上的 StartNewAsync (.NET) 或 startNew (JavaScript) 方法启动一个新实例。在内部,此方法将消息排入控制队列,然后触发具有使用编排触发器绑定的指定名称的函数的启动。

当编排进程成功调度时,此异步操作完成

来源

当成功调度编排进程时,此异步操作完成。

所以是的:您应该等待这些电话(也可以按照米格尔的建议并行完成)。但不会超过几毫秒。