使用 SubOrchestratorFunction

Use SubOrchestratorFunction

我正在尝试了解并行化在 Durable Function 中的工作原理。我有一个具有以下代码的持久函数(遵循本教程:https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-sub-orchestrations?tabs=csharp#example

        [FunctionName(nameof(OrchestratorFunction))]
        public async Task RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {           
            var items = await context.CallActivityAsync<List<Item>>(nameof(GetItemFunction), null);
            if (items != null && items .Count > 0)
            {
                var processingTasks = new List<Task>();
                foreach (var item in items)
                {
                    Task processTask = context.CallSubOrchestratorAsync(nameof(SubOrchestratorFunction), item);
                    processingTasks.Add(processTask);
                }
                await Task.WhenAll(processingTasks);               
            }
        }

        [FunctionName(nameof(SubOrchestratorFunction))]
        public async Task RunSubOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            var item = context.GetInput<Item>();            
            var name = await context.CallActivityAsync<Item>(nameof(GetNameFunction), item);
            var age = await context.CallActivityAsync(nameof(GetAgeFunction), item);
            var address = await context.CallActivityAsync(nameof(GetAddressFunction), item);            
            var state = await context.CallActivityAsync(nameof(GetStateFunction), item);
            var country = await context.CallActivityAsync(nameof(GetCountryFunction), item);            
        }  

我想做的是获取所有项目,所有项目应该 运行 并行。

此代码是否 运行 所有项目并行?意思是 10 件物品和 10000 件物品所花费的时间是一样的?在测试中,我发现 10 个项目和 10000 个项目所花费的时间有所不同。我错过了什么吗?

有许多因素会影响持久函数的运行时间,与较小的工作负载相比,这些因素可能会显着改变非常大的工作负载的运行时间。其中之一是从 1 个实例扩展到 200 个实例的时间。

还有一个事实是 activity 函数是基于队列触发器的,我认为在再次扩展之前等待 30 秒的持续时间,每个触发器也有预热时间。 (与普通队列相比,活动可能比较特殊)

我不知道横向扩展的确切逻辑,但如果控制队列没有变大,它可能不会选择这样做。您可以通过门户查看您有多少实例和线程运行。对于非常大的任务,它也可能受到内部使用的队列或表的限制。

这也取决于您在活动中的依赖性。如果您正在拨打 API 电话或发送电子邮件,那么这些服务还需要能够同时处理 10000 个请求。

还有一个事实是您受限于每个实例的内核数。比方说 4。这为您提供了 800 个核心。我认为每个活动最多运行 10 个线程,这意味着它可能只会尝试同时处理 8000 个活动(可能在 800 到 8000 之间,具体取决于计算工作)。

这些是我能想到的一些可能会限制更大进程的原因。可能有更多关于这一切如何运作的信息。有些东西也可以配置。并行化与 运行 一切按顺序相比如何?

文档: https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-perf-and-scale

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

https://github.com/Azure/azure-functions-durable-extension/issues/1686

https://github.com/Azure/azure-functions-durable-extension/issues/1686

对我猜测的原因持保留态度。我不知道内部工作的确切细节和数量,但提供了一些可以扩展的想法。无论如何,期望他们同时完成是非常不合理的。重要的一点是总运行时间比没有并行化要小得多。