Azure 持久函数扇出扇入建议

Azure Durable Function Fan Out Fan In suggestion

我只是想听听您对适合我的场景的最佳方法的意见。我有一个要处理的联系人列表,可以是 100 个或更多。对于每个联系人,可能需要不到一分钟的时间即可完成。

我已经尝试了函数链接和 Fan-Out/Fan-In 模式。 Function Chaining 需要更长的时间来处理,如果处理时间超过 5 分钟,肯定会抛出 Time Out,这可能会发生。 Fan-out/Fan-in 另一方面,并​​行处理联系人,但每个实例只能处理 100 条记录[不确定原因]。我不是 100% 确定在可扩展性方面的影响。

//Function Chaining
var contacts = context.CallActivityAsync<List<Contacts>>("GetContacts", null);
await context.CallActivityAsync("ProcessContacts", contacts);

//Fan-out/Fan-in pattern
var contacts = context.CallActivityAsync<List<Contacts>>("GetContacts", null);
foreach(var contact in contacts){
    await context.CallActivityAsync("ProcessContact", contact);
}

老实说,我想选择 Fan-Out/Fan-In,但同样,我不确定其影响。

我只是想就我应该选择哪种模式征求意见。

您上面的代码不是扇出,为了扇出,您需要一次创建所有 activity 请求,然后等待它们全部完成。这样,消费计划将继续生成实例,直到它完成所有工作。

尝试将您的扇出代码更改为如下内容:

var tasks = new List<Task>();
foreach (var contact in contacts)
{
    tasks.Add(context.CallActivityAsync("ProcessContact", contact));
}
await Task.WhenAll(tasks);

这为每个联系人创建了 1 个 activity 任务,并将它们放入队列中以供函数处理;然后等待它们全部完成。

一旦你看到这个 运行 你就会想看看 maxConcurrentActivityFunctions 取决于 CPU 等你的处理强度如何 你可能只想处理 5 个联系人在单个实例上并行。

你可以试试一开始设置为1,然后说10,看看速度差异是多少,你会发现你拥有的联系人越多,maxConcurrentActivityFunctions越小,Consumption plan创建新实例的速度就越快,但是在速度方面可能效率不高,因此您需要在单个 CPU 实例和 maxConcurrentActivityFunctions 的最佳使用之间找到平衡点。

我建议您将其连接到一个 Application Insights 实例,然后查看实时指标,它会向您显示 CPU/Memory 使用情况以及正在创建的实例数量。

希望对您有所帮助。