cadence-workflow - 在 Cadence/Temporal/iWF 中使用工作流程重置功能的最佳方法是什么?

标签 cadence-workflow temporal-workflow uber-cadence

在有关工作流程重置的设计中我应该考虑什么?

最佳答案

工作流程重置可能是 Cadence/Temporal 中最强大、最独特的功能。它允许您将任何工作流程执行重置到历史记录的任何先前点,并保留所有信号(默认情况下,但如果指定则可以跳过)以重新应用。

以下是将工作流程设计为可重置的最佳实践:

  1. Activity(或 iWF 中的 State API)应该是幂等的,并且在重新执行时没有副作用。尽管无论重置如何,事件都应该是幂等的,但在结果记录到历史记录后,事件将不会重新执行。但是,通过重置,您应该期望该事件即使在执行并记录到历史记录之后也可以重新执行,因为工作流程可以随时重置。

  2. 工作流应该能够处理信号重新应用——这是默认的重置行为,但在某些罕见的情况下您也可以跳过信号重新应用。默认情况下应首选信号重新申请,因为信号通常用作外部数据输入,并且可能很难重新获取。

  3. 如果1.无法实现,请考虑向self发送信号,以避免重新执行某些非幂等或重新执行时有副作用的逻辑(例如activity)。信号经过专门处理以进行复位。默认情况下保留所有信号。例如,如果您有一个工作流程读取一些数据然后写入一些数据,则重置后,工作流程可能会读取不同的数据以写入数据库,这可能会导致一些副作用。要解决此问题,您可以向自身发送带有读取结果的信号,并在工作流程中处理该信号。

  4. 或者,考虑使用不同的工作流程对某些重置不安全的逻辑执行操作 - 例如,发出某些指标可能无法安全重置。以便可以在可重置安全的工作流程上执行重置。

  5. 不要使用 childWorkflow 功能。使用事件来启动其他工作流程作为“子工作流程”。请参阅Should I use child workflow or use activity to start new workflow了解更多。 (iWF 不允许您使用 childWF)

  6. 期望将工作流程重置为最开始(firstDecisionTask/firstWorkflowTask)。尽管允许将工作流程重置到历史记录的任何点,但通常很难找到重置点(eventId),因为很难用工作流程代码解释历史事件。重置为开始可以让您的生活更轻松地重置数千个工作流程。尽管如此,重置到开始状态还是要付出一些性能损失的。 (使用 iWF 查找重置点会容易得多,因为 iWF 将使用 stateId 直接将您的业务逻辑与历史 eventId 关联起来)

关于cadence-workflow - 在 Cadence/Temporal/iWF 中使用工作流程重置功能的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74542338/

相关文章:

go - 根据外部(例如用户)输入更改 Uber Cadence sleep 时间

cadence-workflow - Uber Cadence 中的子工作流程有什么好的用例?

cadence-workflow - 将外部事件发送到工作流

cadence-workflow - 如何测量节奏中正在运行的工作流程数量

cadence-workflow - 如何让 Cadence 工作流程拒绝信号

go - 在 Cadence 工作流程中的循环内调用相同的事件

unit-testing - Uber Cadence 事件的单元测试上下文

时间:如何以编程方式创建命名空间?

typescript - 使用 TypeScript 时如何知道是否在临时工作流程内运行