我应该如何为 ActivityOptions 选择 ScheduleToStartTimeout 和 StartToCloseTimeout 值
How should I pick ScheduleToStartTimeout and StartToCloseTimeout values for ActivityOptions
ActivityOptions 中有四个不同的超时选项,其中两个是强制性的,没有任何默认值:ScheduleToStartTimeout
和 StartToCloseTimeout
。
选择这些超时值时应考虑哪些因素?
如问题中所述,ActivityOptions 中有四种不同的超时选项,对于新的 Cadence 用户来说,它们之间的区别可能不是很清楚。让我们先简单解释一下它们是什么:
ScheduleToStartTimeout
:该配置指定最大
Activity 由工作流安排的时间与
它被 activity 工作人员拾取并开始执行它。其他
换句话说,它配置了任务在队列中花费的时间。
StartToCloseTimeout
:这个指定了最大耗时
activity 工作人员从获取任务到报告
完成它到Cadence服务器。
ScheduleToCloseTimeout
:这个配置指定了一个端到端的
activity 的超时持续时间从
工作流程,直到由 activity 名工人完成。
HeartbeatTimeout
:如果你的activity是心跳activity,这个
配置基本上指定了 Cadence 的最大持续时间
服务器会在假设 activity worker 之前等待心跳
失败了。
如何select一个合适的超时值
如果您知道 StartToCloseTimeout
的作用,那么选择 StartToCloseTimeout
就相当简单了。本质上,您应该使这段时间足够长,以便 activity 可以在正常情况下完成。因此,您应该考虑所有可能影响 activity 工作人员花费的时间和下游延迟(即服务、网络等)的因素。另一方面,您的目标应该是使该值尽可能小,以使您的端到端系统响应更快。如果你不能让这个超时时间少于几分钟(最好是 1 分钟或更短),你应该考虑使用 HeartbeatTimeout
配置并在你的 activity 中实现心跳。
ScheduleToCloseTimeout
也很容易理解,但更常见的是在这里选择一个不太理想的值而导致的问题。因此,确保花点时间特别注意此配置很重要。
基本上,您应该考虑所有可能在 activity 任务队列中造成积压的事情。导致积压的一些常见事件是:
- 由于部署、维护或
网络相关问题。
- 下游延迟峰值会增加
完成每个 activity 任务,然后降低吞吐量
工作人员池。
- 安排的工作流实例数量显着增加
activity;特别是如果其中一项上游服务也是
异步 queue/stream 处理器,可以创建自己的积压
然后突然开始大量处理它。
理想情况下,在任务队列中等待时 activity 不应超时,尤其是在队列已备份且 activity 配置为重试时。因为重试会向队列中添加更多 activity 任务,并随后使从积压中恢复变得更加困难或使情况变得更糟。另一方面,在许多用例中,业务需求确实限制了系统处理 activity 的总时间。因此,只要业务需求允许,将 ScheduleToCloseTimeout
值作为目标通常不是一个坏主意。根据您的用例,将 activity 在队列中保留超过几分钟可能没有意义,或者在超时之前将其保留几天可能完全没问题。
ActivityOptions 中有四个不同的超时选项,其中两个是强制性的,没有任何默认值:ScheduleToStartTimeout
和 StartToCloseTimeout
。
选择这些超时值时应考虑哪些因素?
如问题中所述,ActivityOptions 中有四种不同的超时选项,对于新的 Cadence 用户来说,它们之间的区别可能不是很清楚。让我们先简单解释一下它们是什么:
ScheduleToStartTimeout
:该配置指定最大 Activity 由工作流安排的时间与 它被 activity 工作人员拾取并开始执行它。其他 换句话说,它配置了任务在队列中花费的时间。StartToCloseTimeout
:这个指定了最大耗时 activity 工作人员从获取任务到报告 完成它到Cadence服务器。ScheduleToCloseTimeout
:这个配置指定了一个端到端的 activity 的超时持续时间从 工作流程,直到由 activity 名工人完成。HeartbeatTimeout
:如果你的activity是心跳activity,这个 配置基本上指定了 Cadence 的最大持续时间 服务器会在假设 activity worker 之前等待心跳 失败了。
如何select一个合适的超时值
如果您知道 StartToCloseTimeout
的作用,那么选择 StartToCloseTimeout
就相当简单了。本质上,您应该使这段时间足够长,以便 activity 可以在正常情况下完成。因此,您应该考虑所有可能影响 activity 工作人员花费的时间和下游延迟(即服务、网络等)的因素。另一方面,您的目标应该是使该值尽可能小,以使您的端到端系统响应更快。如果你不能让这个超时时间少于几分钟(最好是 1 分钟或更短),你应该考虑使用 HeartbeatTimeout
配置并在你的 activity 中实现心跳。
ScheduleToCloseTimeout
也很容易理解,但更常见的是在这里选择一个不太理想的值而导致的问题。因此,确保花点时间特别注意此配置很重要。
基本上,您应该考虑所有可能在 activity 任务队列中造成积压的事情。导致积压的一些常见事件是:
- 由于部署、维护或 网络相关问题。
- 下游延迟峰值会增加 完成每个 activity 任务,然后降低吞吐量 工作人员池。
- 安排的工作流实例数量显着增加 activity;特别是如果其中一项上游服务也是 异步 queue/stream 处理器,可以创建自己的积压 然后突然开始大量处理它。
理想情况下,在任务队列中等待时 activity 不应超时,尤其是在队列已备份且 activity 配置为重试时。因为重试会向队列中添加更多 activity 任务,并随后使从积压中恢复变得更加困难或使情况变得更糟。另一方面,在许多用例中,业务需求确实限制了系统处理 activity 的总时间。因此,只要业务需求允许,将 ScheduleToCloseTimeout
值作为目标通常不是一个坏主意。根据您的用例,将 activity 在队列中保留超过几分钟可能没有意义,或者在超时之前将其保留几天可能完全没问题。