Durable Functions中如何跟踪Activity Trigger的执行进度与输出
如何在Durable Functions编排运行时跟踪已完成的Activity输出?
我正在使用Durable Functions构建编排器服务,核心代码如下:
public static class Flow { [FunctionName(nameof(Flow))] public static async Task<List<string>> FlowRunOrchestrator( [OrchestrationTrigger] IDurableOrchestrationContext context) { var outputs = new List<string>(); // 串行调用Activity outputs.Add(await context.CallActivityAsync<string>( nameof(FlowSayHello), "Tokyo")); outputs.Add(await context.CallActivityAsync<string>( nameof(FlowSayHello), "Seattle")); outputs.Add(await context.CallActivityAsync<string>(nameof( FlowSayHello), "London")); return outputs; } [FunctionName(nameof(FlowSayHello))] public static async Task<string> FlowSayHello( [ActivityTrigger] string name, ILogger log) { await Task.Delay(10000); log.LogDebug($"Saying hello to {name}."); return $"Hello {name}!"; } [FunctionName(nameof(FlowHttpStart))] public static async Task<HttpResponseMessage> FlowHttpStart( [HttpTrigger( AuthorizationLevel.Anonymous, "get", Route = "02")] HttpRequestMessage req, [DurableClient] IDurableOrchestrationClient starter, ILogger log) { string instanceId = await starter.StartNewAsync(nameof(Flow), null); log.LogInformation($"Started orchestration with ID = '{instanceId}'."); return starter.CreateCheckStatusResponse(req, instanceId); } }
目前的问题是:每次Activity执行完成后,虽然编排器内的outputs列表已更新,但调用状态查询URI时,仅能看到整个编排的运行状态,无法获取已完成Activity的输出。例如,当Tokyo对应的Activity完成后,状态响应的output字段仍为null:
{ "name": "Flow", "instanceId": "dd8ed17a7fc4446fb9ee5e5087e53087", "runtimeStatus": "Running", "input": null, "customStatus": null, "output": null, "createdTime": "2022-07-12T14:54:22Z", "lastUpdatedTime": "2022-07-12T14:54:32Z" }
只有当所有Activity全部执行完成后,output字段才会返回完整的输出列表:
{ "name": "Flow", "instanceId": "dd8ed17a7fc4446fb9ee5e5087e53087", "runtimeStatus": "Completed", "input": null, "customStatus": null, "output": [ "Hello Tokyo!", "Hello Seattle!", "Hello London!" ], "createdTime": "2022-07-12T14:54:22Z", "lastUpdatedTime": "2022-07-12T14:54:53Z" }
希望能在每个Activity完成时,通过状态URI获取已完成的输出内容,该如何实现?
解决方案:利用Durable Functions的Custom Status功能
Durable Functions提供的SetCustomStatus方法,允许编排器在运行时主动更新自定义状态信息,状态查询API会返回这个customStatus字段,正好用来传递中间的Activity输出。
- 修改编排器代码,添加自定义状态更新
在每个Activity执行完成后,调用context.SetCustomStatus(outputs),将当前已完成的输出列表同步到自定义状态中:
[FunctionName(nameof(Flow))] public static async Task<List<string>> FlowRunOrchestrator( [OrchestrationTrigger] IDurableOrchestrationContext context) { var outputs = new List<string>(); // 执行Tokyo的Activity并更新状态 var tokyoOutput = await context.CallActivityAsync<string>(nameof(FlowSayHello), "Tokyo"); outputs.Add(tokyoOutput); context.SetCustomStatus(outputs); // 更新自定义状态 // 执行Seattle的Activity并更新状态 var seattleOutput = await context.CallActivityAsync<string>(nameof(FlowSayHello), "Seattle"); outputs.Add(seattleOutput); context.SetCustomStatus(outputs); // 更新自定义状态 // 执行London的Activity并更新状态 var londonOutput = await context.CallActivityAsync<string>(nameof(FlowSayHello), "London"); outputs.Add(londonOutput); context.SetCustomStatus(outputs); // 更新自定义状态 return outputs; }
- 查看更新后的状态响应
当Tokyo的Activity完成后,状态查询API会返回包含已完成输出的customStatus字段:
{ "name": "Flow", "instanceId": "dd8ed17a7fc4446fb9ee5e5087e53087", "runtimeStatus": "Running", "input": null, "customStatus": ["Hello Tokyo!"], "output": null, "createdTime": "2022-07-12T14:54:22Z", "lastUpdatedTime": "2022-07-12T14:54:32Z" }
当Seattle的Activity完成后,customStatus会更新为:
"customStatus": ["Hello Tokyo!", "Hello Seattle!"]
所有Activity完成后,output字段会返回完整列表,同时customStatus也会包含相同的内容。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

