Appearance
分布式系统
分布式系统面试的重点不是背产品名,而是面对网络分区、节点故障、重复消息和并发写入时,能够说明系统要保证什么、放弃什么,以及故障后如何恢复。
推荐学习顺序
- 部分失败、故障模型、逻辑时钟;
- Leader-Follower、Multi-Leader、Leaderless;
- 线性一致性、因果一致性、最终一致性;
- CAP、PACELC 与 Quorum。
- 多数派、term、选主和日志复制;
- Raft 的提交与安全性;
- 脑裂、租约、分布式锁和 fencing token。
- 哈希 / 范围 / 一致性哈希分片;
- 分布式 ID、2PC、TCC、Saga、Outbox;
- 幂等、消息投递语义、顺序、重试和缓存一致性。
- 网关、玩家 / 房间分片、Actor mailbox;
- 状态同步、AOI、跨服迁移和热点房间;
- 背压、ownership epoch、恢复与尾延迟监控。
一个统一的分析框架
遇到分布式设计题时,按以下顺序展开:
- 业务不变量:哪些结果绝对不能同时出现,例如同一房间不能有两个写所有者;
- 一致性要求:需要线性一致、会话一致,还是最终一致;
- 分片单位:玩家、房间、订单或其他实体如何路由;
- 故障模型:进程崩溃、网络分区、慢节点和磁盘故障分别如何处理;
- 写入成功定义:写入本机、持久化、复制到多数派,还是已产生外部效果;
- 重试与幂等:超时后是否可能重复,如何去重;
- 顺序与版本:是否需要 sequence、term、epoch 或版本号;
- 过载策略:队列是否有界,哪些请求可拒绝、合并或丢弃;
- 恢复目标:RPO、RTO 和迁移 / 回放方案;
- 可观测性:如何发现热点、积压、脑裂和一致性异常。
高频概念对照
| 概念 | 解决的问题 | 不自动保证什么 |
|---|---|---|
| 复制 | 冗余、读扩展和故障恢复 | 不自动提供强一致 |
| 分片 | 容量和吞吐水平扩展 | 不自动解决热点和跨分片事务 |
| 共识 | 对值或日志顺序达成一致 | 不等于业务分布式事务 |
| Quorum | 用相交集合协调副本 | 仅靠公式不保证线性一致 |
| 分布式锁 | 临界区所有权协调 | TTL 本身不能隔离旧持有者 |
| 消息队列 | 解耦、削峰和异步传播 | 不自动保证端到端恰好一次 |
| Saga | 多个本地事务的补偿流程 | 不提供普通 ACID 回滚和隔离 |
| 一致性哈希 | 降低扩缩容数据迁移 | 不解决单个热 key |
面试表达原则
- 先给结论,再说明适用前提和失败场景;
- 不说“绝对不丢”“天然有序”“完全一致”,除非能给出协议边界;
- 区分平均情况、最坏情况和分区期间行为;
- 所有超时重试都追问一次:“原操作可能已经成功吗?”;
- 所有租约和 Leader 都追问一次:“旧持有者恢复后如何被拒绝?”;
- 所有消息语义都追问一次:“外部副作用是否也在保证范围内?”