故事

泉州城里有过三座钟楼。

第一座在府衙门口,叫"更鼓楼"。晨钟暮鼓,全城以此为度——几时开城门、几时闭坊市、几时宵禁,都听它的。知府每年花大钱维护,机括用油、钟槌换铜,生怕它慢了一刻。更鼓楼追求的是一致:全城一个时间,不许各行其是。

第二座在港口,叫"潮信楼"。它不报时辰,只报潮信——涨潮、平潮、退潮,各船老大按自己的货单决定几时出港、几时归泊。潮信楼从不强求所有船同时动身,它只保证每个船老大最终都能知道潮信。潮信楼追求的是可用:你来了,就有信给你,不会白跑。

第三座在城郊破庙里,是个歪脖子老钟,绳断了多年,钟槌悬在半空。庙里住着一个老僧,偶尔有人来问时辰,他就指指天,说"日头到这儿了",或者"该吃饭了"。这口钟既不一致,也不可用——但它有个好处:从来不怕分区的。府衙和港口都靠信使传讯,信使被山贼截了、被台风阻了,两地就断了联系;破庙老僧谁也不靠,分区不分区,跟他没关系。

这三座楼在泉州并存了七十年,各自运转,互不隶属。城里的人按需要选择:打官司去府衙听更鼓,跑船去港口看潮信,城郊佃户找老僧图个方便。没人觉得它们之间必须"三选二"——更鼓楼和潮信楼同时开着,府衙和港口同时用着,各自处理各自的事。

后来来了个新知府,姓周,进士出身,好写条陈。他把三座钟楼的格局写进一份《泉州时辰统筹策》,呈给巡抚,想博个"善治"之名。条陈里他画了个三角:一角写"一致",一角写"可用",一角写"分区容忍",然后在下面批了一句:"三者不可得兼,凡治一城,必择其二。"

巡抚看不懂,转给幕僚。幕僚里有位老先生,曾在两广管过海关,看完把条陈搁在案上,说:"周大人这三选二,是把三座楼当成一座楼来写了。"

周知府不服,请老先生细说。

老先生说:更鼓楼和潮信楼,本来就不是同一座楼,各有各的规矩、各有各的用场。你让更鼓楼去学潮信楼"来了就给信",它就没法保证全城一个时辰;你让潮信楼去学更鼓楼"全城同步",它就没法保证每条船来了都能立刻知道潮信。这不是"三座楼选两座拆一座"的问题,这是同一座楼在不同时候该守什么规矩的问题。

周知府的条陈被退了回来,但他那句"三选二"却传开了。传到后来,泉州城里新开的酒楼、茶肆、甚至赌坊,都在门口挂牌子:"本店一致且可用,分区恕不保证"——好像分区是什么客人可以选不要的服务似的。

最荒唐的是港口。有一年台风季,潮信楼和更鼓楼的信使路全断了,船老大们聚在码头等消息。管事的新手是个读周知府条陈入门的,他宣布:"我们选了一致和可用,所以分区期间暂停服务。"船老大们哗然——潮信楼的本分就是在分区的时候继续报潮信,你停了,要你这楼何用?

老先生后来去港口,把潮信楼的规矩改了回来:分区时,各船按最后收到的潮信自行判断,楼继续运转,等信使路通了再补发错过的潮信。这叫分区时选可用,恢复后追一致——不是"三选二"那种静态的取舍,是动态的、按阶段切换的。

周知府晚年调任他方,临走前去看过那座破庙的歪脖子钟。老僧已经死了,钟还在。他忽然明白:那口钟从来不是"选了分区容忍",它只是没参与这个游戏。CAP 三角里的 P,根本不是"你选不选"的选项,是现实砸在你脸上的条件——网络会断,信使会死,台风会来,你接不接受,它都在。

你把 P 当成可选的,就会像那些挂牌子的酒楼一样,假装分区不会发生;你把 P 当成必选的,才会认真去想:分区来了,我这座楼是像更鼓那样暂停等同步,还是像潮信那样继续运转事后补齐?

概念解析

Martin Kleppmann 在 2015 年的论文 A Critique of the CAP Theorem 里,把 CAP 二十年来积累的误读一次性拆干净。最核心的一条:CAP 不是"三选二"

P 不是选项,是前提。 分区容忍(Partition Tolerance)描述的是"网络可能断开"这个物理现实。你生活在一个有网络的系统里,P 就已经成立——不是"你选不选",是"你承不承认"。那些声称"我们选了 CA 不要 P"的系统,只是在分区发生时假装没看见,或者祈祷分区别来。泉州城郊的破庙老僧可以说自己不要 P,因为他根本不联网;府衙和港口只要还在靠信使传讯,P 就在。

C 和 A 不是系统级别的静态标签,是操作级别的动态选择。 潮信楼在分区期间继续报信(选 A),恢复后补发错过的潮信(追 C);更鼓楼在分区期间暂停敲钟(保 C),等信使路通了再校准复鸣。同一个系统,不同阶段可以切不同的模式。Kleppmann 的修正方案是把 CAP 重新表述为"分区期间,选一致还是选可用"——一个时序问题,不是架构问题

"三选二"的毒害。 周知府的条陈之所以流传,是因为它给了人一种虚假的简洁——好像分布式系统的取舍可以像点菜一样勾勾选选。工程团队因此倾向于把自己系统钉死在某个标签上:"我们是 CP"或"我们是 AP",然后停止思考具体场景下该怎么行为。实际上,Spanner 在大多数时候线性一致(C),但遇到某些故障时会降级为可用(A);Cassandra 号称 AP,却可以通过配置调到强一致。标签是偷懒的,行为才是真的。

CAP 真正的教学价值。 CAP 不是设计指南,是诊断工具。它帮你问对问题:当分区发生时,我这个操作要停要等(C),还是继续事后补(A)?这个答案没有 universal 的正确,取决于操作性质——转账余额校验?停。日志写入缓冲?继续。Kleppmann 建议把 CAP 忘掉,改用更精确的术语:线性一致性、顺序一致性、最终一致性、可用性的量化定义——这些才能指导工程。

泉州的三座钟楼至今还在,虽然更鼓楼改成了电报房,潮信楼装上了无线电。周知府的条陈收在府志里,作为"善治未遂"的注脚。最常被引用的还是老先生改回潮信楼规矩时说的那句话:"分区不是选项,是天气。问一座楼选不选分区,就像问一艘船选不选台风。"