P82 强一致还是保可用?Base 理论又是什么?
面试题:什么是 CAP 定理?什么是 BASE 理论?分布式系统怎么取舍?
1. CAP 定理
分布式系统最多只能同时满足两个:
- C(Consistency)一致性:所有节点同一时刻看到同一份数据;
- A(Availability)可用性:每个请求都能得到响应(不保证数据最新);
- P(Partition tolerance)分区容错性:网络分区(断网/节点失联)时系统仍能工作。
网络分区在分布式环境必然发生,所以 P 必须选,实际是在 CP 和 AP 之间二选一:
- CP:牺牲可用性保证一致(ZooKeeper、etcd);
- AP:保证可用,数据最终一致(Eureka、大多数电商场景)。
2. 什么是 BASE 理论(对 AP 的扩展)
text
B: Basically Available(基本可用)
A: Soft State(软状态)
E: Eventually Consistent(最终一致)- 基本可用:系统出问题时,允许损失部分功能/响应变慢,但整体可用(如降级、限流);
- 软状态:允许数据存在中间状态(不同节点数据暂时不一致);
- 最终一致:经过一段时间(无新写入),所有副本最终达成一致。
3. BASE 与 ACID 的关系
- ACID 是单机/强一致模型(原子性、一致性、隔离性、持久性);
- BASE 是分布式弱一致模型:放弃强一致,换取高可用和性能,通过补偿/重试达到最终一致。
4. 实际应用
| 场景 | 选择 |
|---|---|
| 支付/转账/库存强扣减 | 强一致(DB 事务、分布式锁、CP) |
| 订单状态/用户资料 | 最终一致(MQ + 重试 + 对账) |
| 注册中心 | Eureka(AP)vs ZK(CP)各有所取 |
| 缓存与 DB | Cache-Aside 最终一致 |
5. 加分点
- 说清"CAP 中的 C 是线性一致性,BASE 的最终一致是放宽版";
- 提到实现最终一致的手段:消息队列、幂等、重试、对账补偿、本地消息表/事务消息;
- 追问"能不能同时满足 C 和 A":无分区时可以(单机),分布式下不行;
- 强调 CAP 是"网络分区时"的取舍,不是随时三选二。
一句话总结
CAP:分布式下 P 必选,在强一致(CP)和高可用(AP)间取舍;BASE 是 AP 的落地理论——基本可用 + 软状态 + 最终一致,用 MQ、幂等、重试、对账把一致性从"强"放宽到"最终",换取可用性和性能。