Prompts-MCP 686 skills · ai / design / design-pattern / framework / fundamentals / habit / lang / tech-selection /mcp/sse
fundamentals fundamentals/distributed-theory/cap-tradeoff.md medium

distributed-cap-tradeoff

CAP 取舍决策 — 分布式系统 P(分区容忍)必选,真正的取舍是网络分区时选 C(一致性,如 ZK/etcd 拒绝服务保正确)还是 A(可用性,如 Eureka/Nacos AP 返回旧数据)。Use when 选注册中心/配置中心的一致性模型 / 评审 CP 还是 AP 时。

cap一致性可用性cpap注册中心
paths
  • *.java

分布式理论 · CAP 取舍

本条只管「C 和 A 之间怎么选」。事务一致性方案见 transaction-solutions.md;幂等见 idempotent-design.md

核心:P 不是选项,C/A 才是

分布式系统一定有网络分区,所以 P 必选;CAP 真正的取舍是「发生分区时,要 C 还是 A」——三者不可能同时满足

取舍 分区时行为 代表组件 适合
CP(保一致) 拒绝服务/不可用,宁可不返回也不返回错的 ZooKeeper、etcd、Consul、Nacos CP 配置/选主/分布式锁,错了代价大
AP(保可用) 始终响应,可能返回旧数据,分区恢复再收敛 Eureka、Nacos AP 模式 服务发现,拿到稍旧节点列表可接受

选型速判

场景 理由
服务注册发现 AP(Eureka / Nacos AP) 注册表短暂不一致可容忍,可用性优先
分布式锁 / 选主 / 配置 CP(ZK / etcd) 读到错的配置/双主,后果严重
金融账务等强一致读 CP 一致性 > 可用性

注意:Nacos 同时支持 AP/CP,按上述场景切换;不要无脑跟风选某个组件,先定 C/A 取向。

反例

❌ 把"高可用"当成"什么都要满足",以为能同时拿到 CAP —— 分区下三选二是定理
❌ 用 CP 的 ZK 做服务发现:ZK 一抖动注册表整个不可用,拖垮全链路(应选 AP)
❌ 用 AP 的注册中心存关键配置/做选主:分区时读到旧值导致双主/脏配置

自检

  • [ ] 先承认 P 必选,把决策聚焦在「分区时要 C 还是 A」?
  • [ ] 服务发现这类容忍短暂不一致的场景选了 AP?
  • [ ] 锁/选主/关键配置这类错了代价大的场景选了 CP?
  • [ ] 用 Nacos 时按场景显式选了 AP / CP 模式,不是用默认凑合?

相关