CAP 定理:奶茶店账本里的真相

105 阅读4分钟

CAP 定理:奶茶店账本里的真相


一、CAP 定理到底说了啥?

CAP 定理是分布式系统的“祖宗规则”:

  • C(Consistency 一致性) :所有人看到的数据必须一样。
  • A(Availability 可用性) :每次请求都要有响应,别让顾客白跑。
  • P(Partition Tolerance 分区容错性) :网络再怎么出幺蛾子,系统也得撑住。

⚡ 重点:在发生网络分区时,你只能在 CA 里二选一。
平时风平浪静的时候,三者可以共存;一旦断网,账和生意只能保一个。


二、奶茶店的比喻

想象你开了 3 家连锁奶茶店:

  • 一致性(C) :总部库存剩 100 杯,广州卖出 1 杯,上海立刻知道只剩 99。
  • 可用性(A) :顾客来点单,必须给结果。
  • 分区容错(P) :广州和总部断网了,上海还能继续营业。

当广州断网时:

  • 选 CP:广州店暂停营业,等总部对完账再卖 → 数据一致,但顾客可能骂娘。
  • 选 AP:广州店继续营业,先记小本本,账以后再对 → 顾客开心,但可能超卖。
  • 选 CA:既保证账对、又保证随时营业。听起来很美妙,但前提是——永远不发生网络分区
    • 换句话说,CA 只能存在于理想状态(单机系统或“不会分区”的专网环境)。
    • 在真实的分布式场景里,CA 几乎没人用,因为 分区是必然

📊 CAP 三种组合对照表

组合特点奶茶店比喻是否常用
CA数据强一致 + 高可用,但不考虑分区每家分店账和总部都实时同步,永远开门,前提是永远不掉线❌ 几乎不用,只存在于单机或专网环境
CP数据强一致 + 分区容错,但可用性可能降低断网时不敢卖,等总部确认再营业✅ 常见于 Zookeeper、Consul、MySQL Group Replication
AP高可用 + 分区容错,但一致性可能暂时丢断网时照常卖,账以后再对✅ 常见于 Eureka、Redis Cluster、MySQL 主从复制

image.png


三、关键问题 1:CAP 针对的是谁?

很多同学都会问:CAP 是在说微服务的节点,还是注册中心的节点?

👉 答案是:

  • 微服务实例节点大多是无状态的(只处理请求,数据放数据库/缓存里)。无状态服务之间几乎没有 CAP 问题。

  • 真正面临 CAP 抉择的,是有状态的分布式中间件

    • 注册中心:Eureka 偏 AP,Zookeeper/Consul 偏 CP,Nacos 可切换。
    • 数据库:MySQL 主从(偏 AP),MySQL Group Replication(偏 CP)。
    • 缓存:Redis Cluster(偏 AP)。

👉 所以在微服务架构里,大家聊 CAP,指的其实是 注册中心和数据库等组件


四、关键问题 2:CAP 只属于微服务吗?

再确认一下:CAP 是不是只针对微服务?

👉 不是!
CAP 是通用的分布式定理,任何分布式中间件都必须遵守。

  • 数据库集群、缓存集群、消息队列、注册中心……
  • 只要有多个节点,需要保持状态,还可能遇到网络分区,就要在 C 和 A 里做取舍。

所以,CAP 并不是“微服务专属”,而是所有分布式系统的原罪。


五、MySQL 的两个剧场

来点实战:

  1. 主从异步复制(AP 倾向)

    • 主库写,从库读。
    • 网络分区时,从库还能查,但数据可能延迟。
    • 口号:生意不能停,账晚点对。
  2. Group Replication(CP 倾向)

    • 多数派确认才能提交。
    • 网络分区时,少数派只能只读。
    • 口号:账要对,不对就不卖。

六、工程界的“偷懒解法”

虽然 CAP 定理很硬核,但工程师们常用两种缓兵之计:

  • BASE 理论:基本可用、软状态、最终一致 → “账可以晚点对,顾客先喝奶茶”。
  • PACELC 定理:没分区时在延迟和一致性之间做选择,更贴近现实。

七、总结

  • CAP 定理的本质:在分区发生时,C 和 A 二选一。
  • 微服务节点本身无状态,CAP 的舞台是注册中心、数据库、缓存、MQ 等中间件。
  • 不是微服务专属,而是所有分布式系统都绕不开的“祖宗规则”。
  • 工程上,常用“最终一致”来在 C 和 A 之间找平衡。

一句话:
👉 CAP 定理就是问你—— “账要对,还是先把生意做了?”