CAP定理

概念

CAP 定理指出,在分布式系统中,系统只能在以下三个属性中同时保证两个:

一致性(Consistency,C):所有节点看到相同的数据。对任一节点的写入操作,其后的所有读取都会返回更新后的值。

可用性(Availability,A):每个发给非故障节点的请求都会得到响应,但不保证响应包含最新数据。

分区容错性(Partition Tolerance,P):即使节点间发生网络分区或消息丢失,系统仍能继续运行。

在理想情况下(网络永不中断),可以同时拥有 C 和 A。但在实际环境中,网络延迟或中断不可避免,因此 P 通常被视为默认前提。真正的取舍在于 A 与 C:当网络分区发生时,是优先保证一致性,还是优先保证可用性?

CAP

一致性优先场景

  • 票务系统(如 12306):若两个用户同时预订同一座位,系统必须确保只有一个用户成功,以避免重复分配。

  • 账户余额:扣款成功后,用户在任何终端查询余额都应反映扣款后的最新结果

可用性优先场景

  • 社交媒体:用户更新个人信息后,短时间内其他用户可能仍看到旧信息,但系统不会返回错误。

  • OLAP 系统:处理海量报表数据时,由于同步延迟,系统可能无法实时反映最新写入,但仍能提供历史数据查询,保证系统可用性。

一致性的补充说明

CAP 定理中所指的一致性通常是强一致性,即所有读取操作都反映最新写入。除此之外,还有其他一致性模型:

强一致性(Strong Consistency)

所有读取均返回最新写入的数据,开销较大,但对银行账户等需要绝对准确性的系统至关重要。

因果一致性(Causal Consistency)

  • 保证具有因果关系的操作顺序一致,但允许无因果关系的操作顺序不同。
  • 因果相关操作:如用户先发帖,再有回复,系统保证先看到发帖再看到回复。
  • 并发无关操作:如不同用户同时点赞不同帖子,其顺序可以在各节点不同。

特殊实现
读己所写(Read-Your-Own-Writes Consistency):用户在同一会话中总能立即看到自己提交的更新。常用于社交媒体。

最终一致性(Eventual Consistency):

系统在经过一段时间后最终达到一致状态,但短期内可能存在不一致数据。典型应用:ClickHouse、分布式缓存等。