Uber Cadence 活动是否应该成为服务实施的一部分?
Should Uber Cadence activities be part of service implementations?
我对在 Cadence 中实施活动的“最佳实践”有疑问。当工作流的活动跨越不同的服务时,活动通常是作为服务本身的一部分实现的,还是更常见的是将活动分开并依靠服务 API:s 与服务交互?
将活动直接嵌入单独服务的原因:
- 长 运行ning 操作:在 RPC 服务中没有标准和干净的方法来实现长 运行ning 操作。如果 activity 可能需要几分钟或更长时间才能到达 运行,则通常需要心跳以确保及时超时。 Cadence客户端库直接支持心跳
- Flow control:Cadence worker配置指定了最大消费率和同时处理的最大活动数。 Cadence worker 本质上是一个队列消费者,只有当它有能力根据配置处理这些任务时,它才会接收新的 activity 任务。当 activity 调用远程服务时,此流控制将丢失。当超载时,远程服务只能使请求失败。在这种情况下,Cadence activity 确实支持指数重试,但依靠失败和重试来进行流量控制显然是一个较差的解决方案。
无法嵌入的情况:
- 调用外部服务:工作流经常必须依赖于无法嵌入 Cadence 活动的现有服务。在这种情况下,activity 调用外部服务是唯一的选择。对于流量控制,请确保在执行 activity 时指定指数重试策略(包括 non-retryable 错误列表)。对于 long 运行ning 操作,将调用建模为两个活动。第一个调用 start whatever API,第二个在 activity 函数内的循环中轮询结果。 PollForResult activity 应该心跳回 Cadence 服务,以确保在托管它的工作程序出现故障时重试。
- 不支持的编程语言:如果您必须使用仍然没有相应的 Cadence 客户端库的语言实现 activity,则将此函数公开为经常服务是最简单的选择。
我对在 Cadence 中实施活动的“最佳实践”有疑问。当工作流的活动跨越不同的服务时,活动通常是作为服务本身的一部分实现的,还是更常见的是将活动分开并依靠服务 API:s 与服务交互?
将活动直接嵌入单独服务的原因:
- 长 运行ning 操作:在 RPC 服务中没有标准和干净的方法来实现长 运行ning 操作。如果 activity 可能需要几分钟或更长时间才能到达 运行,则通常需要心跳以确保及时超时。 Cadence客户端库直接支持心跳
- Flow control:Cadence worker配置指定了最大消费率和同时处理的最大活动数。 Cadence worker 本质上是一个队列消费者,只有当它有能力根据配置处理这些任务时,它才会接收新的 activity 任务。当 activity 调用远程服务时,此流控制将丢失。当超载时,远程服务只能使请求失败。在这种情况下,Cadence activity 确实支持指数重试,但依靠失败和重试来进行流量控制显然是一个较差的解决方案。
无法嵌入的情况:
- 调用外部服务:工作流经常必须依赖于无法嵌入 Cadence 活动的现有服务。在这种情况下,activity 调用外部服务是唯一的选择。对于流量控制,请确保在执行 activity 时指定指数重试策略(包括 non-retryable 错误列表)。对于 long 运行ning 操作,将调用建模为两个活动。第一个调用 start whatever API,第二个在 activity 函数内的循环中轮询结果。 PollForResult activity 应该心跳回 Cadence 服务,以确保在托管它的工作程序出现故障时重试。
- 不支持的编程语言:如果您必须使用仍然没有相应的 Cadence 客户端库的语言实现 activity,则将此函数公开为经常服务是最简单的选择。