Saga 事务基础:定义与两种实现模式对比

2.1 Saga 事务的定义

Saga 是一种用于管理分布式系统中长事务的架构模式。它将一个全局事务拆分为一系列本地事务(称为“步骤”),每个步骤都有对应的补偿操作。当某个步骤失败时,Saga 会依次执行之前已成功步骤的补偿操作,以撤销已产生的副作用,从而保证最终一致性。

核心思想: 放弃传统 ACID 的强隔离性,采用“补偿”机制实现最终一致性。每个本地事务提交后立即释放资源,避免长时间持有数据库锁。

Saga 事务的关键特征:

  • 本地事务序列: 每个参与者独立提交自己的本地事务。
  • 补偿操作: 每个正向步骤都预先定义好一个反向操作,用于撤销该步骤的影响。
  • 最终一致性: 不保证全局强一致性,但保证在无故障或补偿完成后系统达到一致状态。
  • 无锁设计: 不持有跨服务的分布式锁,适合高并发场景。

2.2 两种实现模式对比

Saga 有两种主流实现模式:Choreography(编排) 和 Orchestration(编舞)。它们在协调方式、耦合度、可追踪性等方面存在显著差异。

对比维度 Choreography(编排) Orchestration(编舞)
协调方式 服务间通过事件异步通信,无中心协调器 由中心协调器(Orchestrator)统一调度
耦合度 服务之间通过事件耦合,新增服务需修改事件订阅 服务只与协调器交互,服务间解耦
可追踪性 分散在多个服务的事件日志中,追踪困难 协调器集中记录状态,易于追踪和调试
复杂度 简单场景下实现轻量,复杂场景下事件流难以管理 协调器逻辑集中,适合复杂业务流程
补偿触发 服务监听失败事件,自行触发补偿 协调器检测失败,统一调用补偿步骤
典型应用 微服务数量少、流程简单的场景 流程复杂、需要严格状态管理的场景

2.3 Choreography 模式详解

在 Choreography 模式中,每个服务在执行完本地事务后,向消息队列或事件总线发布事件。其他服务监听这些事件,并根据事件内容决定下一步操作。没有中心化的协调者。

适用场景: 服务数量少(通常 2-4 个)、业务流程简单、团队希望减少中心依赖的微服务架构。

典型流程示例(订单创建 Saga):

  1. 订单服务创建订单(状态:待支付),发布“订单已创建”事件。
  2. 支付服务监听该事件,执行扣款,发布“支付成功”事件。
  3. 库存服务监听“支付成功”事件,扣减库存,发布“库存已扣减”事件。
  4. 若支付失败,支付服务发布“支付失败”事件,订单服务监听后取消订单(补偿)。
Choreography 模式:事件驱动的 Saga 流程 订单服务 支付服务 库存服务 事件总线(Kafka / RabbitMQ) 发布“订单已创建” 监听并扣款 发布“支付成功” 监听并扣库存 补偿路径:支付失败 → 发布“支付失败” → 订单服务取消订单 失败时触发补偿

2.4 Orchestration 模式详解

Orchestration 模式引入一个中心化的协调器(Orchestrator),负责管理 Saga 的执行流程。协调器向各个服务发送命令,服务执行后返回结果,协调器根据结果决定下一步是继续正向流程还是触发补偿。

注意: 协调器本身可能成为单点故障和性能瓶颈。生产环境中通常需要对协调器做高可用部署,并确保其状态持久化。

典型流程示例(订单创建 Saga):

  1. 协调器向订单服务发送“创建订单”命令。
  2. 订单服务执行成功,返回订单 ID。
  3. 协调器向支付服务发送“扣款”命令(携带订单 ID)。
  4. 支付服务执行成功,返回支付凭证。
  5. 协调器向库存服务发送“扣减库存”命令。
  6. 若任意步骤失败,协调器按逆序调用补偿操作(取消订单、退款、恢复库存)。
Orchestration 模式:中心协调器驱动的 Saga 流程 Saga 协调器 订单服务 支付服务 库存服务 1. 创建订单 2. 返回订单ID 3. 扣款 4. 返回凭证 5. 扣库存 6. 返回结果 补偿流程(任意步骤失败时触发) 协调器按逆序调用:取消订单 → 退款 → 恢复库存 所有补偿命令由协调器统一发出,状态集中管理 失败 → 进入补偿

2.5 模式选择建议

选型决策:
  • 若业务流程简单(2-3 个服务)、团队希望快速迭代,优先考虑 Choreography。
  • 若业务流程复杂(超过 4 个服务)、需要严格的状态管理和审计追踪,选择 Orchestration。
  • 若对延迟敏感,Choreography 的事件异步通信通常比 Orchestration 的同步调用延迟更低。
  • 若需要与现有系统集成,Orchestration 的协调器可以更容易地适配异构服务。

两种模式并非互斥,在大型系统中可以混合使用:核心流程使用 Orchestration 保证可靠性,边缘流程使用 Choreography 降低耦合。