真实面经题目 · 原创解析
分布式系统中的一致性怎么保证?
这题考察一致性目标拆解、复制提交协议、读写路径取舍和故障后的收敛能力,不能只背 CAP 或只说加锁。
真实面经题目 · 原创解析
这题考察一致性目标拆解、复制提交协议、读写路径取舍和故障后的收敛能力,不能只背 CAP 或只说加锁。
回答时先把一致性分层:副本之间的数据一致性、跨服务状态一致性、业务最终收敛。强一致场景通常用单 leader、WAL、多数派提交、Raft/Zab 等方式确定写入顺序;读路径要选择读 leader、Quorum 读或带版本的会话读,避免读到旧副本。允许最终一致的业务,要用 outbox/事务消息、幂等消费、重试、补偿、对账和告警,把超时、重复、乱序和分区后的状态拉回正确结果。
不要直接说强一致。先问业务是否要求线性一致、读己之写、单调读,还是能接受秒级最终一致。资金、库存、权限变更通常更偏强一致;计数、动态、通知通常可以用最终一致换可用性和吞吐。
典型强一致写入链路是 leader 收到请求,先写 WAL,再复制到多数派副本,达到提交条件后推进 commit index,状态机 apply,最后返回客户端。这样即使少数节点故障,也能从日志恢复出同一顺序。
写入一致不代表读一定一致。读从库可能遇到复制延迟;读 leader 延迟更高但结果新;Quorum 读写可通过 `R + W > N` 提升读到最新版本的概率;会话一致要保存版本号或路由到能覆盖该版本的副本。
微服务之间很难用一个本地事务解决所有修改。常见做法是本地事务写业务表和 outbox,再异步投递消息;消费者按业务唯一键幂等处理,失败进入重试、死信、补偿任务和定期对账。
网络分区、leader 切换、请求超时、客户端重试都可能造成双写、旧读或重复执行。高质量回答要说明如何用多数派、任期、幂等键、状态机前置校验和人工兜底限制错误扩大。
看错误成本和可接受窗口。钱、库存、权限这类错误不可接受的状态要提高一致性;点赞数、通知、搜索索引可接受短暂延迟,更适合最终一致。
因为读集合和写集合必然有交集,读请求有机会读到最新写入的副本。但它还要配合版本比较、故障处理和正确的读修复,不能只记公式。
不能。重试会放大重复执行风险,必须配合幂等键、唯一约束、状态机校验和可观测的补偿任务。
依赖多数派和任期约束,只有获得合法多数派的 leader 能提交;业务层还要用 fencing token 或版本号防止旧持有者继续写入。