我有一个场景,需要计算 500k 活动。都是小算盘。由于限制,我只能同时计算 30 个。
想象一下下面的简单示例:
[FunctionName("Crawl")]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
WriteLine("In orchistration");
var outputs = new List<string>();
// here i get 1 million jobs
var jobs = await context.CallActivityAsync<List<Influencer>>("GetSocialAccountJobs", "");
var tasks = new Task<string>[jobs.Count];
var retryOptions = new RetryOptions(
firstRetryInterval: TimeSpan.FromSeconds(60), maxNumberOfAttempts: 3);
for (int i = 0; i < jobs.Count; i++)
{
tasks[i] = context.CallActivityWithRetryAsync<string>("Crawl_Hello", retryOptions, jobs[i].Id);
}
await Task.WhenAll(tasks);
return outputs;
}
每次调用活动时,都会调用此协调器函数。并循环所有活动,直到找到尚未调用的活动。它将循环数百万次。我是否遗漏了某些东西,或者持久功能不适合这种场景?
耐用的功能自动缩放 https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-perf-and-scale#auto-scale在消费计划和弹性溢价计划中运行时。有一些记录的绩效目标 https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-perf-and-scale#performance-targets这有助于部署持久功能。
具体来说,根据您的情况,您可能需要注意以下事项
与扇出不同,扇入操作仅限于单个虚拟机。如果您的应用程序使用扇出、扇入模式,并且您担心扇入性能,请考虑将活动函数扇出细分为多个子编排 https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-sub-orchestrations.
因此,您可以触发一个具有较小批次作业的子编排器,而这些作业又会调用活动函数,而不是从单个编排器调用数百万个活动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)