SIGNAL ONLINE CAP & PACELC // 网断了,你保哪个

CAP 与 PACELC

CAP THEOREM & PACELC // 网断了,你保哪个

> 分布式系统最著名的一句判决:网络分区发生时,一致性与可用性二选一。它常被讹传成“三选二”的菜单,但真实的含义更锋利——分区不是选项而是宿命(网络一定会断),CAP 真正说的是:断网那一刻,你要么拒绝服务保数据对,要么继续服务忍数据错。PACELC 再补一刀:就算网不断,延迟与一致性也得二选一——这台天平从不收工。

SUBJECT: 分布式系统 FILE: cards/cap-pacelc SINCE: 1999 猜想 / 2002 定理 / 2012 扩展 BUILD v1.0

Principle — 原理与来源

CAP 定理 CAP THEOREM // Brewer → Gilbert & Lynch
分区发生时,一致性与可用性不可兼得
if P → choose C or A PACELC: if P → C/A;else → Latency/Consistency
"三选二"是讹传:P 不是可弃选项,是分布式的前提条件。

三个字母的严格含义:C(一致性)——线性一致性:任何读都返回最新写,所有节点看到同一世界(不是“最终一致”那种弱 C);② A(可用性)——每个非故障节点对每个请求都必然在有限时间内返回非错响应(不允许超时/拒绝);③ P(分区容错)——网络可以丢消息、延迟任意久,系统仍要按上述承诺运转。注意 C 和 A 的定义都极苛刻——这是 2002 年证明成立的前提,放松任何一点(“基本可用”“最终一致”),“不可能三角”就有松口。

为什么分区时 C/A 必须二选一(两节点证明直觉版):节点 N1、N2 之间网线断了。客户端向 N1 写 x=1,向 N2 读 x。N2 收不到 N1 的消息——它要么等待/拒绝(保 C 弃 A),要么返回旧值(保 A 弃 C)。没有第三条路:N2 不知道自己缺的那条消息存不存在。这不是工程缺陷,是信息论意义上的不可能

谱系:1999/2000,Eric Brewer(加州伯克利教授、Inktomi 创始人)在 PODC 研讨会提出直觉性猜想(“WEB 服务规模下的权衡”);2002,MIT 的 Seth Gilbert 与 Nancy Lynch 给出形式化证明,猜想升格定理;2012,Brewer 发表《CAP 十二年后》自我修正:强调“三选二”是误导——分区是罕见事件,系统应该在“分区时”与“正常运行时”采取不同策略(分区时弃 A 保 C 或反之,恢复后补偿)。同年 Daniel Abadi 提出 PACELC:把“正常运行时的延迟 vs 一致性”补进权衡——PA/EL(如 Dynamo 牺牲延迟换可用)、PC/EC(如 BigTable/HBase 牺牲可用保一致),天平全天候在线。

"三选二"是流传最广的讹读——Brewer 本人 2012 年澄清:P 不是可以"放弃"的选项(放弃 P = 假装网络永不中断,单机系统);真实抉择只在分区发生的那段时间里 C vs A。把它当菜单勾选("我们选 CA")在分布式语境下无意义。 ② 证明里的 C 是线性一致性,比日常说的"强一致"更强——很多系统自称 CP 其实只达到序列一致性/读己之写;讨论前先对齐 C 的档位,否则是鸡同鸭讲。 ③ CAP 不禁止"分区时弃 A、平时高可用"——Brewer 2012 的核心修正:分区分分钟是少数时间,把分区期的策略与常态策略分开设计(如银行渠道:柜面 PC、查询 AP),是工程正解而非违反定理。 ④ PACELC 不是"推翻" CAP——它把 CAP 没覆盖的"无分区时段"补进权衡表,两者是包含关系不是替代关系;中文资料常见"Dynamo 违反了 CAP"属于把弱化实现当定理违反。 ⑤ "CA 系统"(无 P)只在单机/共享内存里存在——严格意义的 CA 是单节点数据库(MySQL 单机);两节点以上网络必然可能断,声称 CA 的分布式产品要么在重新定义术语,要么在赌运气。 ⑥ Brewer 的动机是商业而非学术——Inktomi 做搜索引擎缓存时发现"不需强一致也能服务好用户",CAP 是把那次工程直觉上升为定理;出处语境是"web 规模服务",不是"一切分布式系统"——航天器、支付清算的权衡结论不能照搬。

Apply — 用在哪里

技术选型先问业务最怕什么:怕错数据(账务/库存扣减)→ 分区保 C(ZooKeeper/HBase/cockroach);怕不能服务(feed/购物车/点赞)→ 分区保 A(Dynamo/Cassandra/Eureka)——PACELC 再看常态要低延迟还是要强读。
接口设计同一个系统可以按接口分级:下单接口 CP、浏览接口 AP——CAP 约束的是"每个数据 × 每个操作",不是整个系统一刀切(Brewer 2012 的分层补偿思路)。
故障预案把"分区时弃谁"写进预案而不是临时拍板:熔断降级清单 = 预先声明弃 A 的名单;分区恢复后的对账/补偿作业 = 弃 C 的还款计划。
团队沟通用 PACELC 代替 CAP 做需求追问器:产品要"又快又准又永远在线"时,摊开这张权衡表——不是不做,是选哪个时段牺牲哪个。
生活迁移异地协作同样 CAP:断网时(飞机/时差)你要"等对方确认"(C)还是"先干着回头对齐"(A)——异步工作的本质是 PACELC 的 EL 段:接受延迟换吞吐。

Simulate — 分区沙盘 × PACELC 选型器

双视角实验室 // 剪断网线看系统怎么办;用 PACELC 决策树选数据库
视角 A:两节点 + 一条网线,你来剪——看 CP 与 AP 的反应截然不同;视角 B:回答三个业务问题,PACELC 决策树给出选型建议
节点 N1
x = 0
NETWORK OK
节点 N2
x = 0

Personal Takeaways — 个人启示 · 03

01

约束先于方案

CAP 的价值不是告诉你“选哪个”,是让你承认权衡存在:一切“既要又要还要”的分布式方案,要么在偷偷放弃某一项,要么在等一次分区教会它做人。先写下你愿意牺牲什么,再画架构图——反过来的图,都是欠费停机的预告。

02

分时段下注,而不是终身承诺

Brewer 2012 修正的深意:分区是事件不是状态——系统可以在 99.9% 的正常时间里高可用 + 强一致(用延迟换),只在分区窗口内切换到预设的牺牲模式。好的架构不是选边站,是写好切换剧本:什么时候弃、弃多久、怎么补。

03

天平从不收工(PACELC)

CAP 只管断网那一会儿,PACELC 提醒你:平时的“快”与“准”也在同一个天平上——每个同步写都在花延迟买一致性,每个异步刷都在花一致性买延迟。看懂这一点,你读任何数据库的默认配置,读到的都是它的价值观