在 Azure Durable Functions 上实现扇出/扇入模式时,是否有办法控制最大并行度?
我目前正在实现此模式来执行数据加载过程,但我遇到了 DTU 的数据库限制,因为操作数量太多,数据库无法处理。
我正在考虑的解决方案涉及使用以下属性:
- maxConcurrentActivityFunctions
- maxConcurrentOrchestratorFunctions
( host.json ) 文件与以下内容结合使用:
前 2 个属性应限制每个主机的并行函数执行数量,而 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 应限制主机数量。
这是否是限制最大并行度的正确方法?
最佳答案
您描述的方法是全局限制最大并行度的最佳方法。请注意,在撰写本文时,WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
并不总是可靠。今年晚些时候,该团队计划使其成为一个完全可靠的设置。
这可能不适用于您的情况,但为了其他发现此问题的读者的利益,我又添加了一件需要考虑的事情。如果您只有一个编排,您可以使用一种简单的 C# 技术来限制最大并行度,即执行如下操作:
static async Task FanOutFanInAsync(
string functionName,
object[] workItems,
int maxParallelism)
{
var inFlight = new HashSet<Task>();
foreach (var item in workItems)
{
if (inFlight.Count > maxParallelism)
{
Task finished = await Task.WhenAny(inFlight);
inFlight.Remove(finished);
}
inFlight.Add(ctx.CallActivityAsync(functionName, item));
}
await Task.WhenAll(inFlight);
}
这将允许您限制单个编排实例一次扇出的事件函数数量。
关于azure - 控制持久函数中扇出/扇入模式的最大并行度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58789750/