我正在查看Azure Durable Functions extension(以及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
堆栈。 (这强制编写的代码不涉及外部范围,因此函数本身可以序列化.etc。)
我对.NET任务(或持久任务)中的核心功能感兴趣,它允许在不同的计算机上序列化和恢复Task
,而无需重新运行已执行的部分(可能在不同的机器)。
答案 0 :(得分:5)
实际上,在HttpClient
完成后运行该函数时,它会第二次执行CallActivity
调用。
除了使用DurableOrchestrationContext API之外,Orchestrator代码绝不能启动任何异步操作。例如,没有Task.Run,Task.Delay或HttpClient.SendAsync。
因此,如果需要调用外部HTTP点,则应将此调用包装在activity函数中,然后从orchestrator调用它。活动呼叫结果保存到表存储,因此下一次调用await
将从那里返回结果,将调用短路到活动功能。