分布式一致性
分布式一致性方案负责维护跨服务的业务规则。本文讲解不变量、同步条件和方案取舍。
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 库存只剩一件时,为什么先确认订单再补偿不能保证不超卖?
出现公司:暂无已核验的公开来源(本站自测)
考察重点:同步不变量、条件更新与预留记录。
相关内容:库存预留与并发不变量。
参考回答
两个订单都确认时,已经违反确认即有货的规则。
退款只能修正后续业务结果。库存服务应先原子预留,只有成功者继续确认。预留记录与扣减共同提交,并用请求唯一键防止重复扣减。