跳到主要内容
约 4 分钟2 张卡

分布式一致性

分布式一致性方案负责维护跨服务的业务规则。本文讲解不变量、同步条件和方案取舍。

1. 面试核心​

先记住这几条,再读正文
  • 业务不变量。 业务不变量定义哪些状态始终合法,一致性方案据此选择。卡 · 综合题
  • 本地事务。 本地事务结合约束或并发控制维护同一边界内的规则。
  • 资源预留。 预留把可用资源转成占用状态,减少跨步骤的超卖风险。卡 · 库存预留与并发不变量
  • 事件与流程恢复。 Outbox 保障本地状态与事件共同提交,Saga 负责跨步骤恢复。
  • 最终一致的条件。 最终一致流程需要中间状态、传播目标和故障恢复入口。

2. 业务不变量​

不变量应具体到可验证规则。例如,同一支付请求最多产生一次扣款。已确认库存保持非负。取消订单停止进入发货流程。

每笔资金变化还需有可核对的记录。用户收到成功后,系统按明确语义保留结果。搜索索引短暂陈旧与重复扣款的代价不同。

3. 原子提交范围​

强耦合规则优先放在同一权威存储中。事务还需配合唯一约束、锁或条件更新。先读后写若缺少并发控制,仍会发生竞态。

服务拆分切开原子边界后,就会增加协调状态。边界应同时考虑业务变化和一致性成本。

3.1 库存预留与并发不变量​

假设库存只剩 1 件,两个订单同时下单。双方各自读到 1,再分别确认订单,会接受两笔购买。事后补偿虽能退款,但已破坏“确认即有货”的规则。

库存服务可在本地执行条件扣减:

UPDATE stock
SET available = available - 1
WHERE sku_id = ? AND available >= 1;

影响 1 行表示预留成功,0 行表示无可用库存或记录缺失。预留记录与扣减需在同一事务提交。预留记录按业务请求设置唯一约束,重复请求读取原结果。

支付失败后按预留 ID 释放一次。预留到期与支付成功也需协调状态。TCC 的具体转换见2PC 与 TCC。

4. 同步确认与异步完成​

接口需定义返回成功时已经满足的条件。库存已预留与支付已授权可作为同步条件。通知、搜索投影和分析事件可异步执行。

处理中应与最终成功区分。窗口内用户能查询真实进度,重复点击沿用业务 ID。

5. 不一致窗口​

最终一致描述副本最终收敛。工程目标还需另行规定传播时间。例如,99.9% 的索引变化在 30 秒内完成。超过 5 分钟则告警并进入恢复。

用户体验也需定义。积分到账前可以显示处理中。搜索结果暂旧时,详情页可查询权威状态。

6. 协调方式​

需要维护的边界候选方式与前提
多个事务资源原子提交2PC 要求持久准备与协调恢复。
跨服务预留资源TCC 要求明确的预留模型。
可补偿的长流程Saga 允许可见中间状态。
本地变化可靠产生事件Transactional Outbox 与 CDC 连接本地提交与异步交付。

Outbox 与 Saga 可以组合使用。前者负责事件来源,后者负责流程推进。协议名称只说明一部分保证。

7. 补偿能力​

退款是一笔新交易,邮件发送后只能发送更正。补偿成本与可逆性决定流程设计。具体边界见Saga。

8. 可追踪的状态​

流程记录稳定 ID、当前步骤和最后错误。尝试次数与下次重试时间也需持久化。

日志可用于诊断,流程状态应有独立权威记录。恢复时按记录继续推进。幂等和人工处置见分布式流程恢复。

9. 故障矩阵​

设计需逐个检查断点:

  • 本地提交前崩溃时,事务回滚。
  • 提交后发布前崩溃时,待发事件仍需恢复。
  • 响应丢失时,请求结果处于未知状态。
  • 重复或乱序到达时,状态转换仍需合法。
  • 补偿持续失败时,需要告警和人工入口。
  • 历史重放时,幂等记录需覆盖该时间范围。

每个断点记录检测信号、恢复方式和最大风险窗口。

10. 常见问题​

10.1 强规则与协议选择​

严格不变量可由本地事务与条件更新保护。跨资源提交再评估 2PC 或预留。范围缩小后,协调成本也会降低。

10.2 消息传输与收敛条件​

11 · 面试题卡片​

11.1 如何根据业务选择分布式事务方案​

出现公司:暂无已核验的公开来源(本站自测)

题型:综合题

考察重点

  • 业务不变量、数据所有权和同步成功条件。
  • 2PC、TCC、Saga、Outbox 的适用前提。
  • 不一致窗口、补偿和故障恢复证据。

相关内容:业务不变量至故障矩阵。

参考回答

按业务必须守住的规则和同步成功条件选择方案,再验证故障时能否恢复。

  • 同一存储内的规则。 用本地事务与并发约束维护。
  • 跨服务的同步协调。 受控资源支持事务协议时可用 2PC;业务资源支持预留时可用 TCC。
  • 允许中间状态的长流程。 用 Saga 组织步骤和补偿,Outbox 保证本地变化可靠地产生事件。

选择后用故障矩阵检查结果未知、重放和恢复,确认方案确实守住业务不变量。

11.2 库存只剩一件时,为什么先确认订单再补偿不能保证不超卖?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:同步不变量、条件更新与预留记录。

相关内容:库存预留与并发不变量。

参考回答

两个订单都确认时,已经违反确认即有货的规则。

退款只能修正后续业务结果。库存服务应先原子预留,只有成功者继续确认。预留记录与扣减共同提交,并用请求唯一键防止重复扣减。

12. 参考资料​