Saga 编排式实现

由中心协调器按状态机依次调用各服务,并在失败时触发补偿;流程逻辑集中、可观测性好,但协调器成为重要组件,需保证其高可用与幂等。

Saga 编排是什么

Saga 用一串本地事务加补偿动作替代跨服务的分布式事务,编排式实现由中心协调器按状态机依次调用各服务,失败时按逆序触发补偿。它的优点是流程逻辑集中、可观测性好、分支与补偿路径清晰;代价是协调器成为关键组件,必须解决高可用、状态持久化、超时与重复回调等问题。它适合流程步骤明确、补偿语义可定义的业务,如订单、支付与预订。

基本信息

结构协调器加有序本地事务与补偿动作
优势流程可见、分支与补偿明确,便于统一监控与人工介入
代价协调器承担编排职责,需处理超时、重试与重复回调
与协同式对比编排式逻辑集中,协同式各服务靠事件自治但流程分散
落地载体持久化状态机或工作流引擎,保证重启后可继续推进

实现要点

  • 状态建模:初始、步骤进行中、补偿中、已完成、已失败
  • 驱动事件:步骤成功、失败与超时事件触发状态迁移
  • 动作幂等:正向调用与补偿动作都要能安全重复执行
  • 持久化:状态与待执行动作先落库,重启后可继续推进
  • 超时控制:每步设置超时与重试上限,超限进入补偿
  • 回调防重:按步骤标识与当前状态校验,过期回调忽略并记录

落地检查项

问题做法
不可逆步骤尽量前移到流程开头,或改为预留(先冻结再扣减)
并发执行同一业务实体的 Saga 按标识串行化推进,避免交叉
人工介入多次补偿仍失败时转入人工队列,附完整步骤轨迹
测试用故障注入逐步模拟超时与失败,验证每条补偿路径收敛
观测监控状态分布、单步耗时与补偿触发次数
补偿不是回滚:补偿是把业务状态推进到另一个合理状态,因此需要业务确认每一步的补偿语义,而不是简单地反向调用。
协调器必须有持久化状态;只把状态放在内存里,重启后流程会丢失且无人知道哪些业务停在中间状态。

易错点

  • 补偿动作未设计幂等,重试造成重复退款或重复释放资源
  • 协调器状态只存内存,重启后流程丢失,中间状态业务无人接手
  • 不可逆步骤放在流程末尾,补偿时已无法恢复,只能人工兜底
  • 回调或重试无过期校验,旧回调覆盖新状态导致流程错乱
  • 同业务实体的多个 Saga 并发推进,状态互相覆盖

数据来源与参考

  • Chris Richardson《Microservices Patterns》(Manning)
  • microservices.io 模式目录:Saga
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌