分布式面试题
2026/1/15大约 3 分钟
分布式面试题
理论基础
1. 什么是 CAP 理论?
分布式系统不可能同时满足:
- C(一致性):所有节点数据相同
- A(可用性):每个请求都能得到响应
- P(分区容错):网络分区时系统仍能运行
由于 P 不可避免,实际是在 CP 和 AP 之间选择。
2. 什么是 BASE 理论?
- BA(基本可用):允许部分功能降级
- S(软状态):允许中间状态存在
- E(最终一致性):最终数据一致
3. 强一致性和最终一致性的区别?
- 强一致性:写操作完成后,所有读操作都能读到最新值
- 最终一致性:写操作完成后,经过一段时间,最终能读到最新值
4. Paxos 和 Raft 的区别?
| 特性 | Paxos | Raft |
|---|---|---|
| 复杂度 | 复杂 | 简单 |
| 角色 | Proposer、Acceptor、Learner | Leader、Follower、Candidate |
| 理解难度 | 难 | 易 |
分布式锁
5. 分布式锁有哪些实现方式?
- Redis:SETNX + 过期时间
- Zookeeper:临时顺序节点
- 数据库:唯一索引或悲观锁
6. Redis 分布式锁如何实现?
// 加锁
SET lock value NX EX 30
// 解锁(Lua 脚本保证原子性)
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
end7. Redis 分布式锁有什么问题?
- 锁被误删:解决方案是加唯一标识
- 锁过期:解决方案是自动续期(看门狗)
- 主从切换:解决方案是 RedLock
8. Redisson 看门狗机制?
- 默认锁过期时间 30 秒
- 后台线程每 10 秒检查锁是否还持有
- 如果持有则续期到 30 秒
9. RedLock 算法?
- 向 N 个 Redis 节点请求加锁
- 大多数节点(N/2+1)加锁成功
- 总耗时小于锁过期时间
- 则加锁成功
10. Zookeeper 分布式锁原理?
- 创建临时顺序节点
- 判断自己是否最小
- 如果是,获取锁成功
- 如果不是,监听前一个节点
11. Redis 和 Zookeeper 分布式锁对比?
| 特性 | Redis | Zookeeper |
|---|---|---|
| 性能 | 高 | 较低 |
| 可靠性 | 较低 | 高 |
| 一致性 | AP | CP |
分布式事务
12. 分布式事务有哪些解决方案?
- 2PC/3PC
- TCC
- Saga
- 本地消息表
- 事务消息
13. 2PC 的流程和问题?
流程:
- 准备阶段:协调者询问参与者
- 提交阶段:协调者通知提交或回滚
问题:
- 同步阻塞
- 单点故障
- 数据不一致
14. TCC 是什么?
Try-Confirm-Cancel:
- Try:预留资源
- Confirm:确认提交
- Cancel:取消回滚
15. TCC 有什么问题?如何解决?
- 空回滚:Try 未执行,Cancel 被调用
- 悬挂:Cancel 先于 Try 执行
- 幂等性:重复调用
解决方案:使用事务状态表记录状态
16. Saga 模式是什么?
长事务拆分为多个本地事务,每个事务有对应的补偿操作。
两种模式:
- 编排模式:中央协调器
- 编舞模式:事件驱动
17. 本地消息表如何实现?
- 执行本地事务
- 写入消息表
- 定时任务发送消息
- 消费者处理消息
- 确认消费
18. Seata 有哪些模式?
| 模式 | 说明 |
|---|---|
| AT | 自动补偿 |
| TCC | 手动补偿 |
| Saga | 长事务 |
| XA | 强一致性 |
其他
19. 分布式 ID 有哪些方案?
- UUID
- 雪花算法
- 数据库自增
- Redis 自增
- 号段模式
20. 雪花算法的结构?
0 - 41位时间戳 - 10位机器ID - 12位序列号21. 分布式限流有哪些算法?
- 计数器
- 滑动窗口
- 漏桶算法
- 令牌桶算法
22. 令牌桶和漏桶的区别?
| 特性 | 漏桶 | 令牌桶 |
|---|---|---|
| 流出速率 | 固定 | 可变 |
| 突发流量 | 不允许 | 允许 |
23. 负载均衡有哪些算法?
- 轮询
- 加权轮询
- 随机
- 一致性哈希
- 最少连接
24. 一致性哈希的优点?
增减节点只影响相邻节点,不会导致大量数据迁移。
25. 如何保证分布式系统的幂等性?
- 唯一索引
- Token 机制
- 状态机
- 乐观锁