You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:01:00