
微服务化让数据分散到多个服务、多个数据库,原本单体中靠本地事务就能保证的一致性,被拆成了跨服务、跨库的分布式一致性问题。很多团队在实践中陷入两种极端:一种对一切业务强上分布式强一致事务,结果锁竞争激烈、性能大幅下降;另一种只靠发消息解耦,却不管消息是否可靠、失败是否补偿,出现数据不一致后长期无人发现。
很多人把问题归结为"分布式事务就是难做",实际上绝大多数源于对一致性需求缺乏分级判断,以及缺少可靠的投递、对账与补偿机制。分布式系统追求的是与业务匹配的一致性,而非绝对的强一致。只有按业务场景选对方案,并补齐可靠消息、幂等消费和对账补偿,才能真正把数据一致性管住。
一、分布式事务落地高频踩坑场景
1. 一致性需求不分级,强一致性方案被滥用
对大部分不需要强一致、只要求最终一致的业务(如积分更新、通知发送、缓存刷新)也强上 XA、2PC 等强一致分布式事务,事务管理器全局协调、锁资源竞争激烈,导致吞吐骤降、故障恢复复杂,最终一致业务反而被拖累。
2. 消息不可靠,投递或消费丢消息
通过消息中间件做服务间解耦与最终一致,但生产端未开启确认、消费端失败未补偿、消息无重试与死信机制,导致消息在投递或消费环节静默丢失,下游数据始终无法对齐,业务出现订单已支付但库存未扣等事故。
3. 消费端未做幂等,重复处理造成脏数据
消息重试、重新投递在分布式环境下是常态,但消费端缺乏幂等设计,同一消息被重复消费导致重复扣款、重复积分、重复通知,数据被污染,且问题难以及时发现。
4. 缺少对账与补偿,不一致长期潜伏
系统上线后从未做过数据对账,跨服务数据不一致的问题被掩盖在正常业务中,直到用户投诉才暴露。缺少定时对账、异常告警与人工补偿通道,一致性风险长期潜伏,一旦爆发损失巨大。
二、分布式事务方案选型原则
1. 按一致性强度分级选型
先判断业务对一致性的真实要求:强一致场景(如账户资金、库存扣减)考虑强一致方案,但务必评估性能损耗;大量最终一致场景(如通知、积分、异步处理)优先采用可靠消息 + 幂等消费 + 对账补偿,避免为一致性付出不必要的性能代价。
2. 尽量缩减跨服务事务范围
在架构上通过服务边界与数据归属设计,尽量让一次业务更新落在单个服务、单库内,减少跨服务事务;必须跨服务的,优先用异步化、最终一致的方式处理,降低强一致事务的使用频率。
3. 明确"宁可最终一致、不要强一致"的场景
对非资金、非核心状态类业务,明确采用最终一致模型,允许短暂不一致,通过消息与对账在可接受时间窗内收敛到一致,换取更高的吞吐与可用性。
三、可靠消息与最终一致方案

1. 本地消息表保证投递可靠
生产端在本地事务中同时写入业务数据与消息记录(本地消息表),业务提交成功、消息随之落库;由独立任务扫描并发送未成功投递的消息,直到投递成功,从源头避免消息丢失。
2. 消息中间件开启可靠投递与重试
生产端开启发送确认,确保消息真正写入中间件;消费端处理失败时进入重试队列,设置合理重试次数与退避策略,超过阈值进入死信队列供人工排查,杜绝失败消息被静默丢弃。
3. 消费端强制幂等
为消息携带全局唯一业务 ID,消费端利用数据库唯一约束、Redis 去重或状态机校验保证幂等,使同一消息被重复消费只生效一次,这是最终一致方案可靠运行的兜底保障。
四、对账补偿与一致性治理

1. 建立定时对账机制
为跨服务的关键数据设计对账任务,定时比对两端数据,及时发现不一致记录;对账结果与异常清单可查可追溯,作为一致性健康的持续监控手段。
2. 设计补偿与冲正通道
对账发现的不一致,通过补偿任务或人工处理通道进行修正;对已发生的错误操作提供冲正机制,支持将数据恢复到正确状态,形成"发现-告警-补偿"的闭环。
3. 一致性指标纳入监控告警
将消息积压、重试次数、死信数量、对账异常数等作为一致性核心指标纳入监控,设置告警阈值,第一时间发现最终一致失控或异常增长,及时干预处理。
五、强一致场景的落地建议
对确实需要强一致的少量核心业务,采用成熟的分布式事务框架(如 Seata 等),用全局事务协调器管理分支事务;务必控制事务范围与时长,避免大事务长锁拖垮性能;强一致事务与最终一致事务在架构上分离,避免相互影响。同时建立完善的监控与恢复机制,事务异常时能快速定位、补偿回滚。
六、总结
分布式事务问题的根源,绝大多数不是"难做",而是对一致性需求缺乏分级判断,以及缺少可靠的投递、幂等、对账与补偿机制。核心原则可以归纳为:按一致性强度分级选型、缩减跨服务事务范围;用本地消息表加可靠消息保证投递可靠,消费端强制幂等兜底;建立定时对账、补偿冲正与一致性监控告警闭环;仅对少量强一致核心业务使用事务框架并严格控制范围。把这几条落地,跨服务数据一致性才能从"靠运气"变成"可治理、可监控、可恢复"。