经Martin Kleppman本人同意,这篇文章是他英文原文的中文翻译。Authorized by Martin Kleppmann, this is a Chinese translation of hisoriginal blog post.
在Jeff Hodges 精彩的博客文章给年轻人关于分布式系统的笔记中,他建议我们用CAP定理来评论系统。 很多人都听取了这个建议,描述他们的系统为"CP" (有一致性但在网络分区的时候不可用),“AP”(可用但是在网络分区的时候不一致) 或者有时候 "CA" (说明"我还没有读过Coda的五年前的文章")。
我同意Jeff的所有观点。唯独他关于CAP定理的观点,我必须表示不同意。CAP定理本身太简单化而且被广泛的误解,以至于在描述系统上没有太多用处。因此我请求我们不要再引用CAP定理,不要再讨论CAP定理。取而代之,我们应该用更精确的术语来理解我们系统的权衡。
(没错,我意识到很讽刺的是我不希望别人再讨论这个话题,但我却正在一篇关于这个话题的博客文章。但是至少这样以后别人问我为什么不喜欢讨论CAP定理的时候,我可以把这篇文章的链接给他。还有,抱歉这篇文章有些吐槽,但是至少这个吐槽有文献引用。)
CAP用的是非常精确的定义
如果你想引用CAP作为一个定理(而不是一个模糊的,用来做数据库市场营销的概念),你需要用非常精确的定义。数学要求精确。只有当你的用词和定理的证明中的定义是一样的时候,这个证明才有意义。CAP的证明用的是非常具体的定义。
一致性(Consistency) 在CAP中是可线性化的意思(linearizability)。而这个是非常特殊(而且非常强)的一致性。尤其是虽然ACID中的C也是一致性(Consistency),但是和这里的一致性没有任何关系。我会在后面解释可线性化是什么意思。可用性(Availability)在CAP中是定义为"每一个请求(request)如果被一个工作中的[数据库]节点收到,那一定要返回[非错误]的结果"。注意到,这里一部分节点可以处理这个请求是不充分的。任意一个工作中的节点都要可以处理这个请求。所以很多自称"高度可用"的系统通常并没有满足这里的可用性的定义。分区容错(Partition Tolerance)基本上就是说通信是在异步的网络中。信