Saga 编排是什么
Saga 用一串本地事务加补偿动作替代跨服务的分布式事务,编排式实现由中心协调器按状态机依次调用各服务,失败时按逆序触发补偿。它的优点是流程逻辑集中、可观测性好、分支与补偿路径清晰;代价是协调器成为关键组件,必须解决高可用、状态持久化、超时与重复回调等问题。它适合流程步骤明确、补偿语义可定义的业务,如订单、支付与预订。
基本信息
| 结构 | 协调器加有序本地事务与补偿动作 |
|---|---|
| 优势 | 流程可见、分支与补偿明确,便于统一监控与人工介入 |
| 代价 | 协调器承担编排职责,需处理超时、重试与重复回调 |
| 与协同式对比 | 编排式逻辑集中,协同式各服务靠事件自治但流程分散 |
| 落地载体 | 持久化状态机或工作流引擎,保证重启后可继续推进 |
实现要点
- 状态建模:初始、步骤进行中、补偿中、已完成、已失败
- 驱动事件:步骤成功、失败与超时事件触发状态迁移
- 动作幂等:正向调用与补偿动作都要能安全重复执行
- 持久化:状态与待执行动作先落库,重启后可继续推进
- 超时控制:每步设置超时与重试上限,超限进入补偿
- 回调防重:按步骤标识与当前状态校验,过期回调忽略并记录
落地检查项
| 问题 | 做法 |
|---|---|
| 不可逆步骤 | 尽量前移到流程开头,或改为预留(先冻结再扣减) |
| 并发执行 | 同一业务实体的 Saga 按标识串行化推进,避免交叉 |
| 人工介入 | 多次补偿仍失败时转入人工队列,附完整步骤轨迹 |
| 测试 | 用故障注入逐步模拟超时与失败,验证每条补偿路径收敛 |
| 观测 | 监控状态分布、单步耗时与补偿触发次数 |
补偿不是回滚:补偿是把业务状态推进到另一个合理状态,因此需要业务确认每一步的补偿语义,而不是简单地反向调用。
协调器必须有持久化状态;只把状态放在内存里,重启后流程会丢失且无人知道哪些业务停在中间状态。