分布式系统场景题
概述
分布式系统是现代互联网架构的核心,涉及一致性、可用性、分区容错等经典问题。本类别精选了最具代表性的分布式系统场景题,帮助你深入理解CAP定理、分布式协调、数据一致性等核心概念。
核心知识点
分布式理论
- CAP定理(一致性、可用性、分区容错)
- BASE理论(基本可用、软状态、最终一致性)
- 2PC、3PC、Paxos、Raft共识算法
分布式协调
- 服务发现
- 配置管理
- 分布式锁
- 选主机制
数据一致性
- 强一致性 vs 最终一致性
- 分布式事务
- 数据同步
- 冲突解决
高可用设计
- 故障检测
- 自动切换
- 负载均衡
- 容灾备份
题目列表
⭐ 如何设计分布式ID生成器
难度: 高级
标签: 雪花算法、唯一性、高性能
考察点: ID生成策略、时钟回拨、分布式协调
分布式ID生成器是分布式系统的基础组件,需要保证全局唯一、高性能、有序性。
核心难点:
- 如何保证全局唯一?
- 如何处理时钟回拨?
- 如何保证高性能(百万级QPS)?
- 各种方案的优缺点?
技术方案:
- 雪花算法(Snowflake)
- 美团Leaf号段模式
- 百度UidGenerator
- 数据库自增ID
相关技术栈:
⭐ 如何设计分布式锁
难度: 高级
标签: 互斥、可靠性、性能
考察点: 锁的可靠性、死锁避免、性能优化
分布式锁用于在分布式环境下实现互斥访问,是分布式系统的核心组件。
核心难点:
- 如何保证锁的可靠性(不会丢失)?
- 如何避免死锁?
- 如何实现可重入?
- 各种实现方案的对比?
技术方案:
- Redis实现(SETNX + 过期时间)
- Redis Redlock算法
- Zookeeper实现(临时顺序节点)
- Etcd实现(Lease租约)
- 数据库实现(唯一索引)
相关技术栈:
⭐ 如何设计分布式事务 🆕
难度: 专家
标签: ACID、一致性、性能
考察点: 事务模型、一致性保证、性能权衡
分布式事务是分布式系统中最复杂的问题之一,是P7+面试的重点难点。详细讲解2PC、3PC、TCC、SAGA、本地消息表五种方案,包含Seata框架的AT/TCC/SAGA模式源码分析。
核心难点:
- 如何保证跨服务的事务一致性?
- 2PC/3PC的性能问题如何解决?
- TCC的幂等性、空回滚、悬挂如何处理?
- SAGA的补偿操作如何设计?
- 如何选择合适的分布式事务方案?
技术方案:
- 两阶段提交(2PC)- 强一致性
- 三阶段提交(3PC)- 改进的2PC
- TCC(Try-Confirm-Cancel)- 最终一致性 ⭐推荐
- SAGA长事务 - 适合长流程
- 本地消息表 - 简单可靠 ⭐推荐
- Seata框架 - AT/TCC/SAGA模式
相关技术栈:
如何设计分布式缓存
难度: 高级
标签: 一致性哈希、缓存策略、高可用
考察点: 缓存架构、一致性保证、故障处理
分布式缓存需要解决数据分片、一致性、高可用等问题。
核心难点:
- 如何实现数据分片(一致性哈希)?
- 如何保证缓存和DB一致性?
- 如何处理缓存穿透/击穿/雪崩?
- 如何保证高可用?
技术方案:
- 一致性哈希算法
- 缓存更新策略(Cache-Aside、Read-Through等)
- 多级缓存架构
- 热点数据处理
相关技术栈:
如何设计分布式任务调度
难度: 高级
标签: 任务分片、失败重试、可视化
考察点: 调度策略、任务分片、可靠性保证
分布式任务调度用于在集群中调度定时任务和批处理任务。
核心难点:
- 如何实现任务分片?
- 如何保证任务不重复执行?
- 如何处理失败重试?
- 如何实现任务依赖?
技术方案:
- 基于数据库的调度(Quartz)
- 基于Zookeeper的调度
- 分片策略(一致性哈希、取模)
- 失败补偿机制
相关技术栈:
学习路径
初学者(P5-P6)
学习重点:
- 理解分布式系统的基本概念
- 掌握CAP定理和BASE理论
- 学习简单的分布式方案
推荐题目:
- 分布式ID生成器(理解雪花算法)
- 分布式锁(理解Redis实现)
进阶者(P6-P7)
学习重点:
- 深入理解分布式一致性
- 掌握各种分布式方案的优缺点
- 学习权衡和选型
推荐题目:
- 分布式锁(对比多种实现)
- 分布式缓存(理解一致性哈希)
- 分布式任务调度
高级工程师(P7-P8)
学习重点:
- 掌握分布式共识算法
- 理解分布式事务原理
- 设计高可用架构
推荐题目:
- 分布式事务(掌握多种方案)
- 分布式一致性协议
- 大规模分布式系统设计
技术要点总结
分布式ID生成对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 数据库自增 | 简单可靠 | 性能差、单点 | 小规模系统 |
| UUID | 全局唯一 | 无序、占空间 | 不需要排序的场景 |
| 雪花算法 | 高性能、有序 | 时钟回拨问题 | 大多数场景(推荐) |
| 美团Leaf号段 | 高性能、DB容灾 | 号段耗尽时阻塞 | 对ID连续性要求不高 |
| 百度UidGenerator | 性能极高 | 依赖机器时钟 | 超大规模场景 |
分布式锁对比
| 方案 | 可靠性 | 性能 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| Redis单机 | 低 | 极高 | 简单 | 允许偶尔失败的场景 |
| Redis Redlock | 中 | 高 | 中 | 大多数场景 |
| Zookeeper | 高 | 中 | 中 | 可靠性要求高 |
| Etcd | 高 | 高 | 中 | 云原生场景 |
| 数据库 | 高 | 低 | 简单 | 低并发场景 |
分布式事务对比
| 方案 | 一致性 | 性能 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| 2PC | 强一致 | 低 | 中 | 小规模、低并发 |
| TCC | 最终一致 | 高 | 高 | 高并发、对一致性要求不极致 |
| SAGA | 最终一致 | 高 | 高 | 长事务、微服务 |
| 本地消息表 | 最终一致 | 高 | 中 | 可接受最终一致 |
常见问题
Q: CAP定理如何理解?
A: CAP定理指出分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)三个特性中的两个。
- CA: 放弃分区容错,单机系统(MySQL单机)
- CP: 放弃可用性,保证一致性(Zookeeper)
- AP: 放弃一致性,保证可用性(Cassandra)
实际中P是必须保证的(网络分区不可避免),所以主要是在C和A之间权衡。
Q: 如何选择分布式锁方案?
A:
- 性能优先 → Redis单机锁(可接受偶尔失败)
- 可靠性优先 → Zookeeper(金融支付场景)
- 均衡方案 → Redis Redlock或Etcd
- 简单场景 → 数据库唯一索引
Q: 分布式事务如何选择?
A:
- 强一致性要求 → 避免分布式事务,尽量单库
- 可接受最终一致 → 本地消息表或可靠消息
- 复杂业务流程 → SAGA模式
- 高并发场景 → TCC模式
相关技术栈
面试技巧
回答框架
理论基础(2分钟)
- 说明CAP/BASE理论
- 解释一致性级别
方案对比(5分钟)
- 列举2-3种主流方案
- 对比优缺点
- 说明适用场景
深入细节(10分钟)
- 画出架构图
- 解释核心流程
- 说明关键技术点
异常处理(3分钟)
- 网络分区如何处理
- 节点宕机如何处理
- 时钟不同步如何处理
常见追问
- 如果网络分区了怎么办?
- 如何保证幂等性?
- 如何处理脑裂问题?
- 时钟回拨如何处理?
实战建议
- 搭建环境: 搭建Redis集群、Zookeeper集群
- 动手实现: 实现一个简单的分布式锁
- 压力测试: 测试各种方案的性能
- 故障演练: 模拟节点宕机、网络分区等场景
提示:分布式系统的核心在于理解权衡(Trade-off),没有完美的方案,只有最适合的方案。面试中要能说清楚不同方案的优缺点和适用场景。
