Azure耐用功能如何恢复?

时间:2017-12-02 12:15:46

标签: c# azure async-await task-parallel-library azure-functions

我正在查看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,而无需重新运行已执行的部分(可能在不同的机器)。

1 个答案:

答案 0 :(得分:5)

实际上,在HttpClient完成后运行该函数时,它会第二次执行CallActivity调用。

这就是documentation says

的原因
  除了使用DurableOrchestrationContext API之外,

Orchestrator代码绝不能启动任何异步操作。例如,没有Task.Run,​​Task.Delay或HttpClient.SendAsync。

因此,如果需要调用外部HTTP点,则应将此调用包装在activity函数中,然后从orchestrator调用它。活动呼叫结果保存到表存储,因此下一次调用await将从那里返回结果,将调用短路到活动功能。