Azure Durable Functions重试逻辑异常及重复输出问题咨询
问题原因与解决方案
1. 重试未触发、结果数小于100的原因
你的编排函数里用try/catch包裹Invoke-DurableActivity -NoWait的写法错误:
Invoke-DurableActivity -NoWait是异步调用,仅返回任务对象,不会在调用时立即抛出活动函数的异常,因此catch块永远不会触发。- 虽然传递了
-RetryOptions,Durable框架会自动处理活动函数的重试,但如果重试达到MaxNumberOfAttempts次数后仍失败,任务会被标记为失败状态。Wait-ActivityFunction会等待所有任务完成,但$results仅包含成功完成的任务结果,失败任务不会被计入,最终$results.count就会小于100。
修复方案
移除try/catch块,Durable框架会自动处理重试逻辑。若需处理最终失败的任务,可在等待所有任务完成后筛选结果:
param($Context) $range = 1..100 $retryOptions = New-DurableRetryOptions -FirstRetryInterval (New-TimeSpan -Seconds 1) -MaxNumberOfAttempts 10 $tasks = foreach ($num in $range) { Invoke-DurableActivity -FunctionName 'RandomWaitActivity' -Input $num -NoWait -RetryOptions $retryOptions } # 等待所有任务完成(含成功与失败) Wait-ActivityFunction -Task $tasks # 筛选出成功完成的任务结果 $results = $tasks | Where-Object { $_.IsCompletedSuccessfully } | ForEach-Object { $_.Result } Write-Information $results.count
2. 编排器多次输出$results.count的原因
Durable Functions的编排器是重入式执行的:
- 每当收到子活动的完成通知(包括重试完成的通知),编排器会从头重新执行整个代码,以重建工作流状态。
- 你的
Write-Information $results.count放在代码末尾,因此每次重入执行时都会触发输出,导致多次打印结果。
修复方案
仅在所有任务完成且编排器非重放状态时输出结果:
param($Context) $range = 1..100 $retryOptions = New-DurableRetryOptions -FirstRetryInterval (New-TimeSpan -Seconds 1) -MaxNumberOfAttempts 10 $tasks = foreach ($num in $range) { Invoke-DurableActivity -FunctionName 'RandomWaitActivity' -Input $num -NoWait -RetryOptions $retryOptions } $results = Wait-ActivityFunction -Task $tasks # 仅在最终完成状态下输出 if (-not $Context.IsReplaying -and $tasks.All({ $_.IsCompleted })) { Write-Information $results.count }
内容的提问来源于stack exchange,提问作者Mark Priem
相关产品推荐
相关产品推荐

