第 7 天学习笔记:分布式核心
今日主题:分布式核心原理
一、分布式核心理论
1. CAP 理论
- C(一致性) :所有节点同一时间看到的数据一致。
- A(可用性) :任何节点故障,系统仍能正常提供服务。
- P(分区容错) :网络分区时,系统仍能工作。
核心结论:分布式系统必须保证 P,只能在 AP 或 CP 中选择。
- 互联网场景:优先 AP(高可用),如 Redis、Eureka。
- 金融场景:优先 CP(强一致),如 ZooKeeper、Etcd。
2. BASE 理论(AP 系统的妥协方案)
- 基本可用:故障时允许服务降级,核心功能可用。
- 软状态:允许中间状态,无需实时一致。
- 最终一致:经过一段时间后,数据自动同步一致。
二、分布式锁(面试高频,重中之重)
1. 核心作用
分布式环境下,保证同一时间只有一个节点能操作共享资源,避免超卖、重复扣款等问题。
2. Redis 分布式锁(最常用)
-
加锁:
SET lock_key unique_value NX PX 30000- NX:仅当 key 不存在时设置。
- PX:设置过期时间(30 秒),防止死锁。
- unique_value:唯一标识(如 UUID),防止误删他人锁。
-
解锁:通过 Lua 脚本原子执行 “判断锁归属 + 删除锁”。
-
防死锁:设置过期时间 + 看门狗自动续期(Redisson 内置)。
-
主从切换锁丢失:通过 RedLock 红锁解决(多节点加锁,半数以上成功才算获取锁)。
3. ZooKeeper 分布式锁(强一致性)
-
原理:临时有序节点 + Watcher 机制。
-
流程:
- 节点创建临时有序节点。
- 判断自己是否是最小节点,是则获取锁。
- 否则监听前一个节点的删除事件。
-
优点:强一致,无锁丢失;缺点:性能低于 Redis。
4. 数据库分布式锁(低并发场景)
- 悲观锁:
SELECT ... FOR UPDATE(行锁)。 - 乐观锁:通过 version 字段判断,更新时
WHERE version = ?。
三、分布式事务(面试难点)
1. 2PC(两阶段提交)
- 准备阶段:所有参与者执行事务但不提交,返回 “成功 / 失败”。
- 提交阶段:全部成功则提交,任一失败则回滚。
- 缺点:阻塞、协调者单点、性能差,不适合高并发。
2. TCC(补偿事务,互联网首选)
- Try:预留资源(如冻结库存)。
- Confirm:确认执行(如扣减库存)。
- Cancel:取消回滚(如解冻库存)。
- 优点:高可用、高性能;缺点:开发成本高,需手动编写补偿逻辑。
3. 本地消息表 / RocketMQ 事务消息
-
核心:本地事务 + 消息队列,实现最终一致性。
-
流程:
- 本地事务(创建订单)+ 插入待发送消息。
- 定时任务发送消息到 MQ。
- 消费 MQ 执行库存扣减,消费成功后删除本地消息。
-
优点:开发成本低,适合中小项目。
四、高可用三件套(微服务核心)
1. 限流
-
目的:保护系统不被流量打崩。
-
常用算法:
- 令牌桶:支持突发流量,主流选择(Sentinel、Nginx)。
- 漏桶:匀速处理请求。
- 滑动窗口:解决临界值问题。
2. 熔断
- 原理:下游服务失败率达到阈值,直接返回兜底数据,不再调用。
- 三状态:闭合 → 打开 → 半开。
- 目的:防止服务雪崩。
3. 降级
- 原理:服务压力过大时,主动关闭非核心功能,保核心功能。
- 与熔断区别:熔断因下游故障,降级因自身过载。
五、RPC 原理(分布式通信基础)
1. 执行流程
- 客户端调用远程方法。
- 代理层序列化请求(对象→二进制)。
- 网络传输(TCP/HTTP)。
- 服务端反序列化,执行方法。
- 序列化结果返回客户端。
2. 核心组件
- 代理:封装网络细节。
- 序列化:Protobuf、JSON、Hessian。
- 注册中心:Nacos、Eureka(服务发现)。
- 负载均衡:轮询、加权、一致性哈希。
3. 主流框架
- Dubbo:高性能,国内主流。
- OpenFeign:HTTP,简单易用。
- gRPC:跨语言,HTTP/2。
六、一致性算法(Raft,简化版 Paxos)
-
角色:Leader、Follower、Candidate。
-
流程:
- 选主:超时未收到心跳,转为 Candidate 发起投票。
- 日志复制:Leader 同步日志到 Follower,过半确认即提交。
-
应用:Nacos、Etcd 均基于 Raft。
七、第 7 天面试题
- CAP 和 BASE 的核心内容及实际选择。
- Redis 分布式锁的实现及防死锁、防误删方案。
- 2PC、TCC、消息方案的区别及适用场景。
- 限流、熔断、降级的作用及落地方式。
- RPC 执行流程及核心组件。
- Raft 算法的角色与主流程。