Azure Durable Functions 如何恢复?
How do Azure Durable Functions resume?
我正在查看 Azure Durable Functions extension (and the Durable Task framework repo) 并寻找它如何处理以下场景的技术细节。
想象一下以下编排。
var result1 = await client.PostAsync("http://some-external-service.com/...", input);
var result2 = await context.CallActivityAsync<string>("Other Function","some data");
... do more stuff with result1 and result2
想象一下,在 Other Function
完成后,在不是第一台机器上恢复了该功能。框架如何在不执行第一个等待的情况下从第二个等待恢复?
事实上,在这种情况下,是否有可能多次执行 HTTP 调用?
我查看了 Microsoft Bot Framework,它有一个 相似的 恢复策略,可以序列化和再水化 Dialog
堆栈。 (这强制编写不引用外部作用域的代码,因此函数本身可以被序列化等)
我对 .NET Tasks(或 Durable Tasks)中的核心功能很感兴趣,它允许在另一台机器上序列化和恢复 Task
而无需重新 运行 它已经执行的部分(可能在不同的机器上)。
其实在CallActivity
之后的运行函数完成后会执行第二次HttpClient
调用
这就是为什么 documentation says:
Orchestrator code must never initiate any async operation except by using the DurableOrchestrationContext API. For example, no Task.Run, Task.Delay or HttpClient.SendAsync.
因此,如果您需要调用外部 HTTP 点,您应该将此调用包装在一个 activity 函数中,然后从 orchestrator 调用它。 Activity 调用结果保存在 Table 存储中,因此对 await
的下一次调用将从那里得到 return 结果,从而使对 activity 函数的调用短路。
我正在查看 Azure Durable Functions extension (and the Durable Task framework repo) 并寻找它如何处理以下场景的技术细节。
想象一下以下编排。
var result1 = await client.PostAsync("http://some-external-service.com/...", input);
var result2 = await context.CallActivityAsync<string>("Other Function","some data");
... do more stuff with result1 and result2
想象一下,在 Other Function
完成后,在不是第一台机器上恢复了该功能。框架如何在不执行第一个等待的情况下从第二个等待恢复?
事实上,在这种情况下,是否有可能多次执行 HTTP 调用?
我查看了 Microsoft Bot Framework,它有一个 相似的 恢复策略,可以序列化和再水化 Dialog
堆栈。 (这强制编写不引用外部作用域的代码,因此函数本身可以被序列化等)
我对 .NET Tasks(或 Durable Tasks)中的核心功能很感兴趣,它允许在另一台机器上序列化和恢复 Task
而无需重新 运行 它已经执行的部分(可能在不同的机器上)。
其实在CallActivity
之后的运行函数完成后会执行第二次HttpClient
调用
这就是为什么 documentation says:
Orchestrator code must never initiate any async operation except by using the DurableOrchestrationContext API. For example, no Task.Run, Task.Delay or HttpClient.SendAsync.
因此,如果您需要调用外部 HTTP 点,您应该将此调用包装在一个 activity 函数中,然后从 orchestrator 调用它。 Activity 调用结果保存在 Table 存储中,因此对 await
的下一次调用将从那里得到 return 结果,从而使对 activity 函数的调用短路。