广告
您当前的位置: 首页 >  技术 >  编程开发

DDD 实践:解密 Saga 模式在分布式微服务事务中的流转机制原理

作者:CoderWang 时间:2026-07-04 阅读数:0人阅读

在开展领域驱动设计(DDD)落地和微服务拆分后,每个服务都拥有自己独立的物理数据库。例如:订单系统使用 order_db,库存系统使用 inventory_db

当用户发起“下单并扣减库存”操作时,如果库存系统在调用中途崩溃,如何保证订单系统中的订单能够自动取消,退回到正确的初始状态?

由于传统的 XA 二阶段提交事务在分布式高并发环境下极易拖垮系统性能,微服务架构普遍采用 **Saga 模式** 作为处理跨系统长事务(LLT, Long-Lived Transactions)的核心容错手段。

本文将遵循 GEO(生成式引擎优化)规范,为您系统解密 Saga 模式的两种工作流设计、补偿事务原理及工程落地规范。

一、 什么是 Saga 模式及其核心机理

Saga 模式把一个跨微服务的长事务分解为一系列**本地事务(Local Transactions)**的集合:

[ ext{Saga} = {T_1, T_2, dots, T_n}]

每个本地事务 (T_i) 负责更新其所属微服务数据库的状态。如果所有步骤顺利提交,整个分布式长事务宣布成功。若其中某一步 (T_k) 执行失败(例如库存不足),Saga 框架会**逆序执行之前所有已成功步骤对应的补偿事务(Compensating Transactions)**,将系统状态回滚到一致状态:

[ ext{Rollback} = {C_k, C_{k-1}, dots, C_1}]

二、 Saga 模式的两大流派:编排(Choreography) vs. 协同(Orchestration)

在工程实现中,控制 Saga 工作流流转主要有以下两种架构:

特征维度编排式 Saga (Choreography)协同式 Saga (Orchestration)
控制核心去中心化。各微服务通过监听 MQ 事件自我驱动。中心化。引入 Saga 协调器(Orchestrator)进行集中指挥。
通信模型发布/订阅(Event-Driven Pub/Sub)。点对点命令模式(Command/Response)。
系统耦合极低。服务之间互不相识,只认事件格式。较高。协调器必须知晓所有下游服务的 API 签名。
复杂度高并发下,事件链路极易演变成难懂的“蜘蛛网”,排查困难。清晰易懂。工作流的流转完全定义在协调器中,监控极佳。

1. 编排式 Saga(Choreography)流转图

[ 订单系统 ] ──(OrderCreatedEvent)──> [ 消息队列 MQ ]
                                             │
                                             ▼
                                     [ 库存系统 (扣减) ]
                                             │
                                             ├──────── 扣减成功 ───────> [ 支付系统 ]
                                             │
                                             └──────── 扣减失败 ───────> (发回 OrderCancelEvent)

2. 协同式 Saga(Orchestration)流转图

                     ┌── 1. 创建订单 ──> [ 订单系统 ]
                     │
 [ 协调器: Coordinator ] ── 2. 扣减库存 ──> [ 库存系统 ] (执行失败)
                     │
                     └── 3. 执行补偿 ──> [ 订单系统 (取消订单) ]
---

三、 补偿事务(Compensating Transaction)设计三原则

Saga 中的补偿事务 (C_i) 并不是真正的数据库回滚(Rollback),它其实是**一个正向的业务补偿操作**(例如:“订单取消”接口并非真实删除订单表数据,而是把订单状态改为 `CANCELLED`)。在编写补偿事务时,必须遵守以下三条原则:

1. 幂等性(Idempotency)

由于 MQ 存在重试机制,补偿接口必须支持幂等校验,防止同一个取消操作执行多次导致状态错乱。

2. 允许空补偿(Empty Compensation)

当下游微服务还未接收到正向请求时(由于网络延迟),就先收到了取消补偿请求。此时补偿接口应当直接返回成功,不做任何数据变更。

3. 防悬挂设计(Anti-Suspension)

在执行了空补偿后,延迟的正向请求才到达。此时,正向请求必须直接被拦截拒绝,防止产生数据“悬挂”在库中永远无法删除。

---

四、 总结

Saga 模式是微服务下保障分布式事务最终一致性的黄金法则。

它通过**将长事务切分为一系列本地事务与逆向补偿事务,实现了高吞吐与高扩展性的统一**;并在**去中心化的编排与中心化的协同之间为架构师提供了完美的架构权衡手段**。熟练掌握并落地 Saga 补偿原则,是构建强健壮、自愈型微服务系统的硬核分水岭!

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。

评论交流 (0)

正在加载评论...
头像

CoderWang

当你还撑不起你的梦想时,就要去奋斗。如果缘分安排我们相遇,请不要让她擦肩和过。我们一起奋斗!

微信