1. Saga 模式概述
1.1 Saga 模式的定义
Saga 是一种用于管理分布式事务的长时事务(Long-Running Transaction, LRT)模式。它将一个全局事务拆分为一组有序的本地事务(Local Transaction),每个本地事务对应一个服务调用,并为每个本地事务定义一个补偿事务(Compensation Transaction)。当某个本地事务失败时,Saga 会依次执行已成功事务的补偿操作,从而回滚整个业务流程。
核心思想:Saga 通过“可补偿的事务序列”替代传统数据库的全局锁与两阶段提交,在微服务架构中实现最终一致性。
1.2 Saga 在分布式事务中的角色
在分布式事务体系中,Saga 主要承担以下角色:
- 事务编排者:协调多个微服务之间的本地事务执行顺序,决定何时提交、何时触发补偿。
- 失败恢复引擎:当业务链路中任意节点发生异常时,Saga 引擎自动反向执行补偿事务,保证数据最终一致。
- 超时与重试管理者:为每个本地事务设置超时阈值,超时后触发重试或补偿,防止事务长时间挂起。
- 状态追踪器:记录每个 Saga 实例的执行状态(Pending / Running / Completed / Compensating / Failed),提供可观测性。
1.3 Saga 与 TCC / 2PC 的对比
下表从多个维度对比 Saga、TCC(Try-Confirm-Cancel)和 2PC(两阶段提交)三种主流分布式事务方案:
| 对比维度 | Saga | TCC | 2PC |
|---|---|---|---|
| 事务模型 | 长时事务 + 补偿 | 预留 + 确认 / 取消 | 短时事务 + 全局锁 |
| 一致性级别 | 最终一致性 | 最终一致性 | 强一致性 |
| 资源锁定 | 无全局锁,本地事务正常提交 | Try 阶段预留资源,Confirm/Cancel 释放 | Prepare 阶段锁定资源,Commit/Rollback 释放 |
| 隔离性 | 弱隔离(需业务层处理脏读) | 中等隔离(预留机制可防脏写) | 强隔离(全局锁阻塞并发) |
| 性能开销 | 低(无锁、异步补偿) | 中(Try 阶段需额外资源预留) | 高(全局锁 + 网络往返) |
| 超时处理 | 本地事务超时 → 补偿 | Try 超时 → Cancel;Confirm 超时 → 重试 | Prepare 超时 → Rollback;Commit 超时 → 阻塞 |
| 适用场景 | 长流程、高并发、可补偿业务 | 短流程、资源敏感、需预留业务 | 短事务、强一致性要求、低并发 |
| 典型实现 | Seata Saga、Eventuate Tram | Seata TCC、Hmily | XA、JTA、Atomikos |
选型建议:在压测场景中,Saga 因其无锁特性和异步补偿机制,通常比 2PC 具有更高的吞吐量;但需要额外关注超时配置对补偿链路的放大效应(详见后续章节)。
1.4 Saga 执行流程示意图
下图展示了一个包含 3 个本地事务的 Saga 正向执行与补偿回滚流程:
1.5 Saga 的两种编排模式
Saga 的实现分为两种主流编排模式,在压测场景中需分别对待:
| 编排模式 | 控制方式 | 优点 | 缺点 | 压测关注点 |
|---|---|---|---|---|
| Choreography( choreography) | 事件驱动,各服务监听事件并自行决定下一步 | 去中心化、耦合低、扩展性好 | 事件流难以追踪、补偿逻辑分散 | 事件总线吞吐量、消息丢失率、补偿延迟 |
| Orchestration(编排) | 中心化协调器(Orchestrator)统一调度 | 流程可视、补偿集中、超时控制精确 | 协调器单点瓶颈、编排逻辑复杂 | 协调器 QPS、超时队列积压、状态机性能 |