分布式CAP原理

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 通常指强一致性/线性一致性,不是泛指所有形式的一致性。