3. Saga事务的两种协调方式:编排(Choreography)与协调(Orchestration)模式详解

Saga事务的核心在于如何协调多个本地事务(子事务)的执行顺序以及异常时的补偿逻辑。根据控制流的归属,业界将Saga的实现分为两种经典模式:编排(Choreography)与协调(Orchestration)。理解两者的差异是设计高可用分布式事务系统的基石。

3.1 编排模式(Choreography)

编排模式是一种去中心化的协调方式。每个参与Saga的微服务在完成本地事务后,通过事件(Event)触发下一个服务的执行。没有中央协调器,服务之间通过事件总线(如Kafka、RabbitMQ)进行异步通信,形成一条事件驱动的执行链。

核心思想:服务之间“相互通知”,每个服务只知道自己下一步该通知谁,但不知道全局流程。

3.1.1 编排模式工作流程

以经典的“订单-库存-支付”Saga为例,编排模式的执行流程如下:

  1. 订单服务创建订单(状态:待处理),并发布“订单已创建”事件。
  2. 库存服务监听该事件,扣减库存,并发布“库存已扣减”事件。
  3. 支付服务监听“库存已扣减”事件,执行扣款,并发布“支付已完成”事件。
  4. 订单服务监听“支付已完成”事件,将订单状态更新为“已完成”。

如果任意一步失败(例如库存不足),则触发反向补偿事件链:

  1. 库存服务发布“库存扣减失败”事件。
  2. 订单服务监听该事件,执行补偿事务(取消订单)。
关键特征:事件驱动、无中心节点、服务间高度解耦、异步通信。

3.1.2 编排模式SVG流程图

Saga编排模式流程图 Saga编排模式(Choreography) — 事件驱动流程 事件总线 (Event Bus / Message Queue) 订单服务 创建订单 库存服务 扣减库存 支付服务 执行扣款 事件: 订单已创建 事件: 库存已扣减 事件: 支付已完成 补偿: 取消订单 补偿: 恢复库存 说明:实线为正向流程,虚线为补偿流程。服务通过事件总线异步通信,无中心协调者。

3.2 协调模式(Orchestration)

协调模式是一种中心化的协调方式。引入一个独立的协调器(Orchestrator),负责管理整个Saga的执行流程。协调器以命令(Command)的方式通知各个参与服务执行本地事务,并根据执行结果决定下一步是继续执行还是触发补偿。

核心思想:协调器“发号施令”,所有服务听从协调器的指挥,协调器掌握全局状态。

3.2.1 协调模式工作流程

同样以“订单-库存-支付”为例,协调模式的执行流程如下:

  1. 协调器向订单服务发送“创建订单”命令。
  2. 订单服务执行成功,回复协调器。
  3. 协调器向库存服务发送“扣减库存”命令。
  4. 库存服务执行成功,回复协调器。
  5. 协调器向支付服务发送“执行扣款”命令。
  6. 支付服务执行成功,回复协调器。
  7. 协调器向订单服务发送“确认订单”命令,完成Saga。

如果库存服务失败,协调器直接向订单服务发送“取消订单”补偿命令,无需等待其他服务。

关键特征:命令驱动、有中心节点、流程控制集中、同步/异步通信皆可。

3.2.2 协调模式SVG架构图

Saga协调模式架构图 Saga协调模式(Orchestration) — 中央协调器架构 Saga协调器 (Orchestrator) 订单服务 创建/取消订单 库存服务 扣减/恢复库存 支付服务 扣款/退款 1. 创建订单 2. 扣减库存 3. 执行扣款 回复: 成功 回复: 成功 回复: 成功 补偿: 取消订单 补偿: 恢复库存 失败触发补偿 说明:实线为命令流,虚线为回复流。协调器掌握全局状态,主动控制每一步的执行与补偿。

3.3 两种模式对比分析

选择哪种模式取决于系统的复杂度、团队技术栈以及对事务一致性的要求。下表从多个维度进行详细对比:

对比维度 编排模式(Choreography) 协调模式(Orchestration)
控制中心 无中心,服务间通过事件驱动 有中心,由协调器统一指挥
通信方式 异步事件(消息队列) 同步/异步命令(RPC/消息)
服务耦合度 低耦合,服务只感知事件 高耦合,服务依赖协调器
流程可观测性 弱,需追踪事件链 强,协调器集中管理状态
复杂度 服务内部逻辑复杂(需处理事件订阅与发布) 协调器逻辑复杂,但服务逻辑简单
错误恢复 通过反向事件链补偿,调试困难 协调器直接触发补偿,易于控制
适用场景 服务数量少、流程简单、团队对事件驱动熟悉 服务数量多、流程复杂、需要强管控
典型实现 Axon Framework、Eventuate Tram Camunda、Temporal、Seata AT/TCC

3.4 模式选择建议

避坑提示:不要因为编排模式“看起来更酷”就盲目选择。如果团队对事件溯源(Event Sourcing)不熟悉,编排模式中的事件风暴和调试成本会急剧上升。对于大多数企业级分布式事务场景,协调模式是更稳妥的选择。
  • 优先选择编排模式:当业务流程简单(2-3个服务)、服务间天然存在事件订阅关系、且团队具备事件驱动架构经验时。
  • 优先选择协调模式:当业务流程复杂(超过3个服务)、需要严格的执行顺序控制、需要审计日志、或者团队希望将事务逻辑与业务逻辑分离时。
  • 混合使用:在大型系统中,可以针对不同子域混合使用两种模式。例如,核心交易链路使用协调模式保证强管控,非核心通知链路使用编排模式降低耦合。
架构决策要点:协调模式牺牲了一定的服务自治性,换来了流程的可控性和可观测性。在分布式事务鉴权拦截场景中,协调模式更容易在协调器层面统一注入鉴权逻辑,而编排模式则需要每个服务独立实现鉴权拦截,增加了重复代码和安全漏洞风险。