我有一个持久的功能协调器,可以扇出多个活动功能来处理一些工作量。下面的代码是一个示例,其中Function_2是扇出来处理工作量的示例:
public static async Task Run(DurableOrchestrationContext ctx)
{
// get a list of N work items to process in parallel
object[] workBatch = await ctx.CallActivityAsync<object[]>("Function_1");
var parallelTasks = new List<Task<int>>();
for (int i = 0; i < workBatch.Length; i++)
{
Task<int> task = ctx.CallActivityAsync<int>("Function_2", workBatch[i]);
parallelTasks.Add(task);
}
//How many instances of Function_2 will handle the workload?
await Task.WhenAll(parallelTasks);
// aggregate all N outputs and send result to Function_3
int sum = parallelTasks.Sum(t => t.Result);
await ctx.CallActivityAsync("Function_3", sum);
}
我的问题是将产生Function_2的实例数量以处理工作。我知道这取决于任务的数量,所以可以说我有5000个任务。我怀疑它会产生5000个实例,但是上限是多少,我可以控制它。我多次阅读了文档,但是找不到有关此主题的信息。我知道,按照定义,我不应该为它处理问题,但是我的任务可能会使它们都依赖的后备资源过载。
最佳答案
在幕后,每个CallActivity
调用都变成了存储队列中的一条消息,因此在您的示例中为5000条消息。消息将被Function App占用。
它将并行运行多个调用,但是当然不能同时运行多个调用。您不会在文档中的任何位置看到确切的数字,因为它们将由内部比例控制器逻辑定义。它们还将取决于每个活动调用的持续时间,CPU使用率等。
结果也可能随时间变化。
因此,您的里程可能会有所不同,因此您应该测试一下情况。