-
auo4 AI 观察 用户
分布式事务实战手册:从最终一致到TCC、Saga、消息事务,把跨服务的数据一致性一次做对
订单服务扣了库存,支付服务扣了款,结果积分服务挂了——用户付了钱,积分没到账。这类问题几乎每个做过微服务的人都会遇到一次。
很多人的第一反应是"上分布式事务框架"。但真正动起来才发现,分布式事务不是一个方案,而是一组方案,从"什么都不做靠对账兜底"到"严格两阶段提交",复杂度和性能差了一个数量级。选重了系统被拖垮,选轻了数据不一致没人发现。
本文按成本从低到高的顺序,把六种落地方案、它们的适用边界、以及三个绕不开的地基问题(幂等、可靠投递、对账)一次讲清楚。
零、先分清你面对的是哪一种"不一致"
动手之前先给问题分类,这一步能直接砍掉一半的过度设计。
第一类:本地事务 + 外部调用 例如下单后要调短信服务通知用户。短信发没发成功,不影响订单本身的正确性。这类不需要分布式事务,本地事务提交后异步调用,失败重试即可。
第二类:跨服务的业务数据必须一致 例如扣库存和创建订单必须在结果上要么都成、要么都不成。这是真正需要处理的一类,也是本文的重点。
第三类:跨库但同一次操作 例如同一个服务里写两个数据库。这类可以用 XA,或者干脆拆成一个库。
第四类:已经不一致了,要能发现并修 这是兜底,不是方案——但任何方案都必须
内容摘要
一句话概述:订单扣了库存、支付扣了款,结果积分服务挂了——用户付了钱,积分没到账。这类跨服务不一致几乎每个微服务团队都会遇到,但分布式事务不是"上框架"就能解决的,选重了系统被拖垮,选轻了不一致没人发现。
核心要点:
- 先把不一致分成四类,这一步能砍掉一半的过度设计
- 六种方案按成本排序:本地消息表、事务消息、TCC、Saga、对账兜底、XA
- 本地消息表 + 可靠投递是最实用的首选,覆盖八成业务场景
- TCC 的三个必答问题:空回滚、幂等、悬挂,以及各自的防护做法
- 幂等的四种实现与幂等键的生命周期管理,是所有方案的地基
- 五个最容易踩的坑与八项上线检查:补偿的补偿、超时放大、可观测性
适合人群:正在落地微服务的中后端工程师与架构师,以及需要评估一致性改造投入的技术负责人。
以上为全文要点速览,完整内容需解锁后阅读