Azure 持久函数:扇出与 Parallel.ForEachAsync

Azure Durable Function: Fan Out vs. Parallel.ForEachAsync

我必须 运行 一个项目列表的函数。我正在使用 Azure Durable Functions,并且可以 运行 使用他们的 fan out/fan in 策略并行处理这些项目。

但是,我想知道这样做与在单个 Activity 函数中使用新的 Parallel.ForEachAsync 方法之间存在什么区别。我需要使用持久函数,因为这是一个永恒的编排,在完成时重新启动。

对我而言,主要区别在于 Durable Functions 将为您处理 failures/retries:

The automatic checkpointing that happens at the await call on Task.WhenAll ensures that a potential midway crash or reboot doesn't require restarting an already completed task.

In rare circumstances, it's possible that a crash could happen in the window after an activity function completes but before its completion is saved into the orchestration history. If this happens, the activity function would re-run from the beginning after the process recovers.

一个Parallel.ForEachAsync绑定到一个Function App实例。这意味着它绑定到 Function App 拥有的资源。当消耗计划中 运行 时,这意味着 1 个 vCPU。

在 Durable Functions 中使用 Fan out/Fan in 方法时,F2 的每个 instance(见图)都是它自己的 Function App 实例。这反过来又可以使用分配给它的全部资源。

简而言之:使用扇出/扇入方法,您使用了(很多)更多资源。可能会给您更快的结果。

最好将两者结合起来:分批工作分派给 'F2',以并行方式处理分批工作。

The fan-out work is distributed to multiple instances of the F2 function. The work is tracked by using a dynamic list of tasks. Task.WhenAll is called to wait for all the called functions to finish. Then, the F2 function outputs are aggregated from the dynamic task list and passed to the F3 function.

The automatic checkpointing that happens at the await call on Task.WhenAll ensures that a potential midway crash or reboot doesn't require restarting an already completed task.

混合和完整性还有一个区别;平行活动的管理。

有了耐用的风扇 out/fan 你就有很多内置的管理控制。

首先,您可以通过 host.json 文件中的配置轻松控制并行进程的数量,其次,您可以通过管理 API manage/monitor 并行活动的进度。

当您访问有限制的资源时,第一个可能会有帮助,例如节流 API,因此它不会被太多请求淹没或超过 API 的效率处理并行请求。以下 hosts.json 示例将持久任务限制为 9 个并发活动:

{
  "version": "2.0",
  "functionTimeout": "00:10:00",
  "extensions": {
    "durableTask": {
      "hubName": "<your-hub-name-here",
      "maxConcurrentActivityFunctions": 9
    },
  "logging" : {
  ...
  }
}

这将命名您的中心并限制并发活动。

然后对于实例管理,您可以查询和终止 activity 个实例,以及向它们发送消息并清除实例历史记录。如果您需要了解活动何时完成,尤其是如果您需要了解每个已完成 activity 的 success/fail 状态,这种功能将非常有用。这有助于可靠地启动依赖于所有活动完成的下游流程。 @Thiago 提到了重试;当使用内置的重试机制时,管理 API 真正发挥作用以监控 运行 活动。它在构建稳固的弹性和处理下游流程方面非常有用。

https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-instance-management?tabs=csharp

https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-task-hubs?tabs=csharp

https://joonasw.net/view/how-azure-durable-functions-scale