我使用Fan-out/fan-in
模式创建了Azure持久编排函数,以并发执行多个函数,然后对结果执行一些聚合,如下所述。
StarterFunc (TimerTrigger Starter)
函数调用OrchestrationOne
函数。OrchestrationOne (OrchestrationTrigger)
是一个协调器函数,它调用活动函数(即ActivityOne
)以获取某个字符串数组。
1.对于ActivityOne
函数返回的每个字符串,编排器使用await Task.WhenAll(tasks)
以相关方式调用另一个称为ActivityTwo
的函数;
代码如下所示:
[FunctionName("StarterFunc")]
public static async Task RunScheduled(
[TimerTrigger("%Starter%")] TimerInfo timerInfo,
[DurableClient] IDurableClient starter,
ILogger log)
{
var instanceId = await starter.StartNewAsync(FuncConstants.OrchestrationDirectToStoreWac, null);
log.LogInformation($"[{DateTime.UtcNow}] - Started orchestration with ID = '{instanceId}'.");
}
[FunctionName("OrchestrationOne")]
public async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
{
// Get all the Strings to be Processed.
var sList = await context.CallActivityAsync<List<string>>("ActivityOne", null);
if (sList.Count > 0)
{
// Process each String in Parallel
var parallelTasks = new List<Task<string>>();
foreach (var s in sList)
{
var task = context.CallActivityAsync<string>("ActivityTwo", s);
parallelTasks.Add(task);
}
// Wait for all results to come back
await Task.WhenAll(parallelTasks);
}
else
{
//log.LogError
}
}
我想了解,是否有可能或更好的方法来调用多个Orchestrator函数使用单一启动器函数?或通过单一Azure函数应用程序内的多个启动器函数?
例如:
- 入门级-〉协调级
- Starter 2-〉Orchestrator 2
1条答案
按热度按时间oknwwptz1#
是的,您的计时器触发器可以启动任意多个编排器。启动编排器主要包括两件事:
1.向示例表中添加行
1.向控制队列发送消息
你的定时器触发器本质上只是做这些事情几次;这是没有问题的。唯一可能的问题是达到了计时器触发器的执行时间限制(默认为5分钟),但您必须启动 * 很多 * 编排器才能实现这一点。请记住,计时器不会等待编排器完成,它只是添加该行并发送消息。