saga是为了解决什么核心痛点而发明的,为什么人家关于saga的教程一开始就是说的saga的核心思想是把长事务拆分为多个短事务,我很懵圈,刚开始学习分布式事务的时候就是多个微服务分别执行的不同事务,现
文章目录
Q:疑问:
saga是为了解决什么核心痛点而发明的?
为什么人家关于saga的教程一开始就是说的saga的核心思想是把长事务拆分为多个短事务,我很懵圈,刚开始学习分布式事务的时候就是多个微服务分别执行的不同事务,现在直接上来就是一个长事务,在搞什么飞机???
我太理解你现在的这种“CPU烧了”的感觉了!你之所以懵圈,是因为你跳进了一个语境陷阱。
你之前的认知是:分布式事务 = 多个微服务的集合(这没错)。
但 Saga 说的 “长事务”,重点不在于“微服务多”,而在于**“时间跨度大”和“外部不可控”**。
咱们直接把这架“飞机”拆开了看:
1. 核心痛点:为什么 AT/TCC 搞不定?
想象一个现实场景:订一张去西藏的旅游套票。
这个业务流程如下:
- 订机票(航司接口,响应可能要几秒甚至几分钟)。
- 订酒店(另一家公司)。
- 租车(又是一家公司)。
痛点一:锁定时间太长(死锁灾难)
如果你用 AT 或 TCC,你必须等机票、酒店、租车全都“Try”成功了,才能统一“Confirm”。
- 问题: 万一航司接口慢,你的数据库连接、酒店的库存就会一直被锁着。在高并发下,整个系统瞬间卡死。这叫同步阻塞。
痛点二:人家不配合你(外部系统)
航司和酒店的接口是人家写的,人家根本不提供 prepare 接口,也不让你在他们数据库里建 undo_log 表。
- 问题: AT/TCC 这种需要“两阶段协议”配合的方案,遇到第三方系统直接抓瞎。
2. 所谓“长事务”到底在搞什么飞机?
你说的“分布式事务就是多个短事务组合”是对的,但 Saga 换了个思路。
Saga 的核心思想:
既然我没法让大家停下来等我(不准加锁),那我就**“先斩后奏”**。
- 普通分布式事务(AT/TCC):大家先别真动,等我口令,一起动(预防式)。
- Saga 模式:大家直接动!第一个人干完了,第二个人接着干。如果最后一个人失败了,前面干完的人再想办法“擦屁股”(补偿式)。
为什么要叫“长事务”?
因为它允许整个业务逻辑持续几分钟、几小时甚至几天。比如你办贷款,银行审批要 3 天,这 3 天里分布式事务一直挂着,AT 模式早崩溃了,但 Saga 可以安稳地等 3 天,等审批结果出来了再走下一步。
3. Saga 的回滚逻辑:补偿事务
Saga 没有任何 undo_log 或冻结机制。它回滚靠的是**“反向业务操作”**。
| 步骤 | 正常动作 (T) | 补偿动作 © |
|---|---|---|
| 1. 订机票 | 扣款买票 | 退票(扣手续费也得退) |
| 2. 订酒店 | 预定房间 | 取消预定 |
| 3. 租车 | 扣押金 | 退押金 |
如果租车失败了:
Saga 会自动调用“取消预定酒店”和“退机票”的接口。虽然机票钱退回来可能少了点手续费(最终一致性),但业务逻辑闭环了。
4. 架构师视角的总结:怎么选?
| 维度 | AT / TCC | Saga |
|---|---|---|
| 实时性 | 强(数据立刻一致) | 弱(最终一致) |
| 隔离性 | 高(别人改不了我的数据) | 低(容易产生“脏写”,钱可能被提前花掉) |
| 适用场景 | 内部微服务、数据库操作 | 跨组织、长流程、第三方支付、审批流 |
简单一句话:
AT/TCC 是为了“万无一失”地锁住资源;而 Saga 是为了在“管不到别人”的情况下,通过“事后补偿”来保命。
你现在感觉“搞飞机”,可能是因为你目前的练习项目都是本地微服务,还没碰到过那种需要调用“携程”、“支付宝”或者“短信网关”这种完全不归你管的情况。一旦碰到这种“外人”,除了 Saga,你没别的招。
更多推荐
所有评论(0)