在 Durable Functions 中控制 Fan-Out/Fan-In 模式中的最大并行度
Controlling the Max Degree of Parallelism in the Fan-Out/Fan-In pattern in Durable Functions
在 Azure Durable Functions 上以模式实施风扇 out/fan 时,有没有办法控制最大并行度?
我目前正在实施此模式以执行数据加载过程,但由于操作数量太多,数据库无法处理,我在 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);
}
这将允许您限制在单个编排实例中一次扇出的 activity 个函数。
在 Azure Durable Functions 上以模式实施风扇 out/fan 时,有没有办法控制最大并行度?
我目前正在实施此模式以执行数据加载过程,但由于操作数量太多,数据库无法处理,我在 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);
}
这将允许您限制在单个编排实例中一次扇出的 activity 个函数。