Saga事务在分布式事务鉴权拦截中的异步补偿机制 - 第2节
2.1 Saga模式的定义
Saga是一种用于管理分布式系统中长事务的异步补偿模式。它将一个全局事务拆分为多个本地事务(子事务),每个本地事务都有对应的补偿事务。当某个本地事务失败时,Saga会按照逆序依次执行之前已成功子事务的补偿操作,从而回滚整个业务流程,保证最终一致性。
核心思想:Saga不依赖数据库层面的分布式锁或两阶段提交(2PC),而是通过业务层面的补偿逻辑实现“事务回滚”,适用于跨服务、跨数据库的分布式场景。
Saga事务的每个子事务Ti都对应一个补偿事务Ci。正常流程下,所有Ti依次执行成功;异常流程下,从失败点开始反向执行Ci,直到所有已提交的子事务都被补偿。
2.2 Saga的两种协调方式
Saga事务根据协调方式的不同,分为编排模式(Choreography)和协调模式(Orchestration)两种。两者在架构、耦合度、控制权方面有显著差异。
2.2.1 编排模式(Choreography)
编排模式下,每个服务在完成本地事务后,通过事件总线发布消息,触发下一个服务的执行。没有中央协调器,服务之间通过事件驱动形成链式调用。
- 通信方式:异步事件(如Kafka、RabbitMQ)
- 控制权:分散在各服务中
- 耦合度:低,服务仅依赖事件契约
- 补偿触发:每个服务监听失败事件并执行自己的补偿逻辑
编排模式优点:服务间解耦、扩展性好、无需中心化组件。
编排模式缺点:业务流程隐式分散在各服务中,调试和监控困难;循环依赖时容易产生事件风暴。
编排模式缺点:业务流程隐式分散在各服务中,调试和监控困难;循环依赖时容易产生事件风暴。
2.2.2 协调模式(Orchestration)
协调模式下,引入一个Saga协调器(Orchestrator)作为中央控制器,负责编排所有子事务的执行顺序,并在失败时触发补偿。协调器通常以状态机方式管理事务生命周期。
- 通信方式:同步RPC或异步消息
- 控制权:集中在协调器
- 耦合度:服务与协调器耦合,服务间解耦
- 补偿触发:协调器统一决策并调用补偿接口
协调模式优点:业务流程集中管理,易于监控、调试和变更;补偿逻辑清晰可控。
协调模式缺点:协调器成为单点瓶颈和潜在故障点;服务与协调器存在耦合。
协调模式缺点:协调器成为单点瓶颈和潜在故障点;服务与协调器存在耦合。
2.3 两种协调方式的对比
| 对比维度 | 编排模式(Choreography) | 协调模式(Orchestration) |
|---|---|---|
| 控制中心 | 无中央控制器 | 有Saga协调器 |
| 通信方式 | 异步事件驱动 | 同步RPC / 异步消息 |
| 业务流程可见性 | 隐式,分散在各服务 | 显式,集中在协调器 |
| 服务耦合度 | 服务间通过事件耦合 | 服务与协调器耦合 |
| 补偿复杂度 | 每个服务自行处理补偿 | 协调器统一编排补偿 |
| 调试与监控 | 困难,需追踪事件链 | 容易,协调器提供全局视角 |
| 典型实现 | Eventuate Tram、Axon | Camunda、Temporal、Seata |
2.4 Saga的适用场景
Saga事务并非万能,它适用于特定类型的分布式事务场景。以下场景适合采用Saga模式:
- 跨服务业务流程:订单、支付、库存、物流等跨多个微服务的业务链路。
- 长事务场景:事务执行时间较长(秒级到分钟级),不适合数据库锁。
- 最终一致性可接受:业务允许短暂的数据不一致,但最终必须一致。
- 高并发、低延迟要求:相比2PC,Saga避免全局锁,性能更高。
- 异构数据源:涉及MySQL、MongoDB、Redis等多种存储,无法使用统一XA协议。
不适合Saga的场景:强一致性要求极高(如金融转账实时对账)、子事务无法设计有效补偿逻辑、业务流程极短且对性能不敏感(此时2PC更简单)。
2.4.1 典型应用案例
以电商下单流程为例,Saga事务的典型应用如下:
- 订单服务:创建订单(状态:待支付)
- 库存服务:扣减库存(补偿:加回库存)
- 支付服务:扣款(补偿:退款)
- 物流服务:创建配送单(补偿:取消配送)
若第3步支付失败,则依次执行:退款(C3)→ 加库存(C2)→ 取消订单(C1),最终回到初始状态。
关键设计原则:每个子事务的补偿操作必须是幂等的,且补偿逻辑本身也要考虑失败重试。在鉴权拦截场景中,补偿机制需要额外处理令牌失效、会话回滚等安全相关操作。