我有一个持久的功能协调器,可以扇出多个活动功能来处理一些工作量。下面的代码是一个示例,其中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使用率等。

结果也可能随时间变化。

因此,您的里程可能会有所不同,因此您应该测试一下情况。

09-20 07:52