CAP 定理是分布式系统中的一个基本理论:一个分布式系统最多只能同时满足以下三个特性中的两个:
C(Consistency,一致性)
所有节点在同一时刻看到的数据相同。更严格地说,读操作能够得到最新写入的数据。
A(Availability,可用性)
每个请求都能在有限时间内得到响应,不能因为部分节点故障而一直拒绝服务。
P(Partition Tolerance,分区容错性)当节点之间的网络发生分区、消息丢失或延迟时,系统仍能继续运行。
核心结论
在真实分布式系统中,网络分区是无法完全避免的,所以通常必须保证 P。
一旦发生网络分区:
选择C:暂停部分请求,保证数据一致
→CP 系统
选择A:允许各节点暂时返回不同数据,保证服务可用
→AP 系统
因此,CAP 更准确的表述是:
当网络分区发生时,系统无法同时保证强一致性和高可用性。
举例
假设有两个副本节点:
客户端 -> 节点 A | 网络断开 | 节点 B客户端向节点 A 写入余额 = 100,但 A 与 B 之间网络中断。
此时:
选择一致性 C
节点 B 无法确认最新数据,因此拒绝或等待请求。
数据一致
可用性下降
典型 CP 思路
选择可用性 A
节点 B 继续响应请求,即使它仍返回旧值。
服务可用
数据可能暂时不一致
典型 AP 思路
网络恢复后,再通过同步、冲突解决等方式最终达成一致。
常见系统分类
| 类型 | 特点 | 常见场景 |
|---|---|---|
| CP | 优先保证一致性,分区时可能拒绝请求 | 分布式锁、支付、库存 |
| AP | 优先保证可用性,允许最终一致 | 社交动态、点赞、DNS、购物车 |
| CA | 同时保证一致性和可用性,但不考虑网络分区 | 单机数据库或理想网络环境 |
需要注意:CA 在真正的分布式环境中通常不现实,因为网络分区始终可能发生。
常见误区
“CAP 只能三选二”并不意味着系统平时只能满足两个特性。
更准确地说:
没有发生网络分区时,系统可以同时表现出 C 和 A;
发生网络分区时,必须在 C 和 A 之间做取舍;
P 不是可以随便放弃的选项。
另外,CAP 中的 C 通常指强一致性/线性一致性,不是泛指所有形式的一致性。