分布式系统的 CAP 困境
CAP 定理是什么、为什么重要、以及在实际系统设计中如何取舍。
CAP 定理是分布式系统设计中最常被引用、也最常被误解的理论之一。
CAP 是什么
CAP 代表三个属性:
- C(Consistency,一致性):所有节点在同一时刻看到的数据是相同的。
- A(Availability,可用性):每个请求都能收到响应(不一定是最新数据)。
- P(Partition Tolerance,分区容错性):即使网络分区(节点间通信中断),系统仍能运作。
CAP 定理说:在分布式系统中,这三个属性最多只能同时满足两个。
为什么 P 不可放弃
在现实的分布式系统中,网络故障是迟早会发生的事,不是假设性场景。这意味着 P 是必须要有的。
所以真正的选择是:在发生网络分区时,你选择 C 还是 A?
CP 系统
牺牲可用性,保证一致性。发生分区时,系统会拒绝服务,而不是返回可能过期的数据。
典型代表:ZooKeeper、etcd。适合做配置中心、分布式锁等”宁可不服务,不能给错误数据”的场景。
AP 系统
牺牲一致性,保证可用性。发生分区时,系统继续提供服务,但不同节点的数据可能暂时不一致。
典型代表:Cassandra、CouchDB。适合社交动态、购物车等”允许短暂不一致,但必须响应”的场景。
实际工程中的理解
CAP 不是一个非黑即白的选择,而是一个关于权衡点的框架。大多数系统会在不同操作上做出不同选择,比如读操作允许返回略旧的数据(AP),但写操作要求强一致(CP)。
理解 CAP,是理解分布式系统设计取舍的起点,而不是终点。