我必须对一个项目列表运行一个函数。我使用Azure持久函数,可以使用它们的扇出/扇入策略并行运行这些项。
但是,我想知道,与在单个活动函数中使用新的Parallel.ForEachAsync方法相比,这样做有什么区别。我需要使用持久的功能,因为这是一个永恒的编排,是重新启动完成。
发布于 2022-04-28 14:43:35
Parallel.ForEachAsync绑定到一个函数App实例。这意味着它被绑定到App所拥有的资源上。在消费计划中运行时,这意味着1 vCPU。
当使用具有持久函数的扇出/扇入方法时,F2的每个实例(参见图像)都是它自己的函数应用程序实例。这反过来又可以使用分配给它的全部资源。

简而言之:使用扇出/扇入方法,您将使用(大量)更多的资源。可能会给你一个更快的结果。
你最好把这两种方法结合起来:一批分配给“F2”的工作,它以并行的方式处理批处理的工作。
扇出工作被分发到
F2函数的多个实例中。通过使用任务的动态列表来跟踪工作。调用Task.WhenAll是为了等待所有调用的函数完成。然后,从动态任务列表聚合F2函数输出并传递给F3函数。 发生在await调用Task.WhenAll上的自动检查点确保了潜在的中途崩溃或重新启动不需要重新启动已经完成的任务。
发布于 2022-04-28 14:39:05
对我来说,主要的区别是,持久的函数将为您处理失败/重试:
在Task.WhenAll上等待调用时发生的自动检查点确保了潜在的中途崩溃或重新启动不需要重新启动已经完成的任务。 在罕见的情况下,在活动函数完成后,但在将其完成保存到编排历史之前,窗口中可能会发生崩溃。如果发生这种情况,活动函数将在进程恢复后从一开始就重新运行。
发布于 2022-05-09 12:20:09
在混合和完整性方面,还有一个不同之处:并行活动的管理。
有了耐用的风扇/风扇在你有很多内置的管理控制。
首先,您可以通过host.json文件中的配置轻松地控制并行进程的数量,其次,您可以使用management管理/监视并行活动的进度。
当您访问有限制的资源(例如节流API )时,第一种方法可能很有帮助,因此它不会被过多的请求淹没,或者超过API处理并行请求的效率。以下hosts.json示例将持久任务限制为9个并发活动:
{
"version": "2.0",
"functionTimeout": "00:10:00",
"extensions": {
"durableTask": {
"hubName": "<your-hub-name-here",
"maxConcurrentActivityFunctions": 9
},
"logging" : {
...
}
}这将命名为集线器&限制并发活动。
然后,例如管理,您可以查询和终止活动实例,以及发送消息和清除实例历史记录。如果您需要知道活动何时完成,尤其是需要了解每个已完成活动的成功/失败状态时,这种功能可能非常有用。这有助于可靠地启动依赖于正在完成的所有活动的下游流程。@Thiago提到了重试;当使用内置的重试机制时,management实际上是自己来监视正在运行的活动。它在构建坚实的弹性和处理下游流程方面确实非常有用。
https://stackoverflow.com/questions/72045448
复制相似问题