面试知识库
困难

数据一致性方案#

一句话答案#

强一致用 2PC/XA(性能差),最终一致用事务消息/TCC/SAGA/本地消息表,根据业务场景权衡一致性和性能。

核心要点
方案一致性性能侵入性
2PC/XA
TCC最终
SAGA最终
消息表最终
事务消息最终低(推荐)
面试回答(2分钟版)

分布式数据一致性方案可以分为强一致和最终一致两大类。强一致方案主要是 2PC/XA,协调者统一控制所有参与者的提交和回滚,一致性好但性能差、存在阻塞问题,适合小范围的数据库事务。大部分互联网场景用最终一致性方案就够了,主要有四种:TCC 适合资金核心场景,Try 预留资源、Confirm 确认、Cancel 回滚,性能高但业务侵入大;SAGA 适合长流程编排,每步有对应的补偿操作,失败时逆序补偿;本地消息表是在业务数据库中额外维护一张消息表,通过定时任务轮询保证消息最终发出;事务消息是最推荐的方案,RocketMQ 原生支持半消息机制,先发半消息再执行本地事务,成功就 commit 失败就 rollback,Broker 还有回查机制兜底。选型原则是能异步不同步、能最终一致不强一致,最终都要靠对账机制做兜底保障。

追问与易错

追问方向:

  • “最终一致能接受多久延迟?”→ 取决于业务 SLA:支付核心链路秒级(消息队列实时消费),积分/优惠券分钟级,报表统计可以小时级或日终对账
  • “怎么选强一致还是最终一致?”→ 资金/库存等核心数据用强一致(2PC/TCC),用户昵称/积分/通知等非核心数据用最终一致(事务消息/SAGA),按业务分级
  • “对账机制怎么设计?”→ 定时任务拉取时间窗口内各服务的数据比对状态,不一致的自动修复(可修复类型)或告警人工处理,核心链路 5 分钟对账,非核心日终对账

易错点:

  • ❌ 分布式一定不能强一致——小范围可以
  • ❌ 最终一致就是慢慢一致——需有明确补偿机制