跳到主要内容
版本:2.0

概述

工作流和活动位于持久执行边界的两侧,遵循不同约束。工作流代码会被重放,活动代码会被重试。两者的规则不同。

先阅读幂等工作流与确定性工作流,比较这两种属性,并理解为什么具备一种属性并不意味着具备另一种。

  • 工作流编排代码必须具有确定性。 无论是在另一个 Worker 上、重启后、部署后,还是长期运行过程中恢复,机制都会重放历史来重建状态。重放重新调用工作流主体,不会重新执行活动。因此,相同历史必须产生顺序相同的决策。工作流主体不能直接读取系统时钟、实时缓存、随机数、网络资源或其他可变来源。通过 Workflow::now()、sideEffect(...)、活动等功能跨越持久边界。

  • 活动代码必须是幂等的。 活动尝试按至少一次执行。重试、租约过期和重新投递,都可能让同一逻辑工作被观察多次。这是正常契约。框架在持久状态层为每次尝试最多记录一个终态结果,但在收到胜出的结果报告前,活动主体可能开始执行多次。将重复执行视为正常情况。如果不能重复外部副作用,就使用幂等键、确定的目标资源或天然幂等的操作。

  • 事件溯源保存历史,不重复已记录的外部副作用。 每个持久步骤,如活动完成、定时器触发、收到信号或记录副作用,都会保存为类型化历史事件。重放读取历史,把已记录的结果交给工作流主体,不会重新派发活动、定时器或信号。即使底层传输多次投递,同一持久标识的状态事件仍只在历史层记录一次。

确定性和幂等性相互配合,使工作流能够跨越部署、Worker 重启和分布式重试继续执行,既不丢失进度,也不重复应用已设计为可安全重试的外部副作用。

执行保证与幂等性说明 v2 关于重放、重新投递、租约过期和持久历史只记录一次的公开契约。工作流约束介绍确定性编排规则,活动约束介绍如何安全地执行至少一次活动。