所以有这么多超时值:
对于本地活动:
- ScheduleToClose 超时
对于没有重试的常规活动:
- ScheduleToStart 超时
- ScheduleToClose 超时
- StartToClose 超时
- 心跳超时
然后retryOptions中的更多值:
- 过期间隔
- 初始间隔
- 退避系数
- 最大间隔
- 最大尝试次数
并且 retryOptions 可以应用于 localActivity 或常规活动。
我如何将它们与什么期望一起使用?
所以有这么多超时值:
对于本地活动:
对于没有重试的常规活动:
然后retryOptions中的更多值:
并且 retryOptions 可以应用于 localActivity 或常规活动。
我如何将它们与什么期望一起使用?
使用超时的最简单方法:
带重试的常规活动:
无需重试的常规活动:
LocalActivity without retry : 使用 ScheduleToClose 进行整体超时
LocalActivity 重试:
世界上的事情不用重试就更容易理解了。因为Cadence就是从它开始的。
ScheduleToClose 超时是从工作流的角度来看的整体端到端超时。
ScheduleToStart 超时是活动工作人员启动活动所需的时间。超过此超时,活动将向工作流返回 ScheduleToStart 超时错误/异常
StartToClose 超时是活动需要运行的时间。超过此值会将 StartToClose 返回到工作流。
要求和默认值:
ScheduleToClose = ScheduleToStart + StartToClose
.ScheduleToClose=Min(ScheduleToClose, workflowTimeout)
:)那么他们为什么会这样呢?
您可能会注意到 ScheduleToClose 仅在
ScheduleToClose < ScheduleToStart + StartToClose
. 因为如果ScheduleToClose >= ScheduleToStart+StartToClose
ScheduleToClose 超时已经被其他两者的组合强制执行了,它就变得毫无意义了。
因此,ScheduleToClose 小于两者之和的主要用例是人们希望限制活动的整体超时,但为 scheduleToStart 或 startToClose 提供更多超时。这是极其罕见的用例。
人们想要区分 ScheduleToStart 和 StartToClose 的主要用例是工作流可能需要对 ScheduleToStart 超时错误进行一些特殊处理。这也是非常少见的用例。
因此,您可以理解为什么在 TL;DR 中我建议仅使用ScheduleToClose而将其他两个留空。因为只有在极少数情况下您可能需要它。如果你想不出用例,那么你就不需要它。
LocalActivity 没有 ScheduleToStart/StartToClose,因为它直接在工作流工作者内部启动,不涉及服务器调度。
心跳对于长时间运行的活动非常重要,以防止它卡住。不仅错误会导致活动卡住,定期部署/主机重启/故障也可能导致它。因为没有心跳,Cadence 服务器无法知道活动是否仍在进行中。在此处查看更多详细信息解决 Cadence/SWF/StepFunctions 中卡住的计时器/活动的解决方案
首先,这里的 RetryOptions 用于server side
退避重试——这意味着重试由 Cadence 自动管理,而不与工作流交互。由于重试由Cadence 管理,因此必须在Cadence 历史记录中对活动进行特殊处理,在活动关闭之前无法写入启动的事件。这里有一些参考:为什么一个活动任务被安排了但没有开始?
事实上,工作流可以client side
自己做重试。这意味着工作流将管理重试逻辑。您可以编写自己的重试函数,也可以在 SDK 中提供一些帮助函数,例如Workflow.retry
Cadence-java-client。客户端重试将立即显示所有启动事件,但在重试单个活动时,历史记录中会有很多事件。由于性能问题,不建议这样做。
那么这些选项是什么意思:
过期时间:
ScheduleToClose = Min(ScheduleToClose, workflowTimeout)
ScheduleToClose = Max(ScheduleToClose, ExpirationInterval)
,这发生在 ScheduleToClose 被复制到 ScheduleToClose 和 StartToClose 之前。InitialInterval:第一次重试的间隔
退避系数:自我解释
MaximumInterval:重试期间的最大间隔
MaximumAttempts:最大尝试次数。如果与 ExpirationInterval 一起存在,则当超过其中之一时重试停止。
要求和默认值:
需要 MaximumAttempts 或 ExpirationInterval。如果未提供,ExpirationInterval 将设置为 workflowTimeout。
由于 ExpirationInterval 始终存在,实际上它更有用。大多数情况下,MaximumAttempts 更难使用,因为它很容易与 backoffCoefficient 混淆(例如,当 backoffCoefficient>1 时,如果不小心,端到端超时可能会非常大)。所以我建议只使用 ExpirationInterval。除非你真的需要它。