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 正向执行与补偿回滚流程:

Saga 正向执行与补偿回滚流程 Saga 正向执行与补偿回滚流程 T1: 订单创建 T2: 库存扣减 T3: 支付扣款 ✅ 成功 ❌ T2 失败 C1: 取消订单 🔄 补偿完成 说明: • 正向:T1 → T2 → T3 → 成功 • 失败:T2 异常 → 触发补偿 • 补偿:仅执行 C1(T1 的补偿) • T3 未执行,无需补偿

1.5 Saga 的两种编排模式

Saga 的实现分为两种主流编排模式,在压测场景中需分别对待:

编排模式 控制方式 优点 缺点 压测关注点
Choreography( choreography) 事件驱动,各服务监听事件并自行决定下一步 去中心化、耦合低、扩展性好 事件流难以追踪、补偿逻辑分散 事件总线吞吐量、消息丢失率、补偿延迟
Orchestration(编排) 中心化协调器(Orchestrator)统一调度 流程可视、补偿集中、超时控制精确 协调器单点瓶颈、编排逻辑复杂 协调器 QPS、超时队列积压、状态机性能