CAP原理简介

翻译自CAP Theorem simplified

如果你曾经使用过任何NoSQL数据库,你一定听说过CAP定理。布鲁尔先生在2000年的分布式计算原理研讨会上谈到了这个定理。

类似于微服务博客,我再次以餐厅为例。在班加罗尔的交通拥堵中,一个IT专业人士(嗯…有没有不开车的?)很有可能会有一天想,我辞掉这份工作,开一家餐厅。

故事开始。Srinivas对IT工作感到厌倦(这通常发生在绩效评估后的85%的人身上),最终辞去了工作,开了一家餐厅。经过仔细考虑,他开始通过电话进行外卖服务。他雇佣了一些送餐员,这些送餐员是在许多外卖创业公司消失后以非常便宜的价格得到的。

第五天:Srinivas选择亲自接听电话,坐在收银台旁边。早上是一个平静的时段。但从晚上7点开始,他开始接到很多电话。无论他接到什么订单,他都会把它写在纸上,交给厨房,然后……嘭……食物就做好了(嗯,并不是每次都是这样),然后送到顾客手中。大约在晚上8:30,他看到一个顾客走向他。他喘着气,显然很生气(也许是因为饥饿)。”我已经打了30分钟的电话了。你的电话一直占线。我不得不走了20分钟才来这里下订单。我不高兴。”

创意时间:Srinivas显然感到非常不满和动摇。在IT服务领域工作时,他每天都被上司告诉”顾客就是上帝,你不能让上帝生气”。作为一个敬畏上帝的人,他在生活中牺牲了许多事情,包括去寺庙。经过一段不安宁的睡眠和思考时间,他得到了一个绝妙的想法。”让我再雇一个操作员来接电话。如果一条线路被占线,另一个人会接听。”他花了一个星期的时间来招聘新的人,同时他也应对了一个星期愤怒的顾客。这是提高”可用性”(Availability)的改进。

第15天:现在新员工Raj已经入职,Srinivas感到非常高兴。顾客在电话中的等待时间大大缩短。如果一条线路被占线,呼叫会自动转接到第二条线路。Srinivas和Raj之间的合作非常顺利。他们能够接受订单并处理它们。

第27天:晚上8点,Srinivas接到一个顾客的电话。”我在45分钟前下了订单。现在的状态是什么?”Srinivas记录下了顾客的电话号码和姓名,然后试图查看他的订单列表。但他找不到。他看了一眼旁边的Raj,但Raj正忙于接受其他订单,他不能打扰他。Srinivas向顾客道歉,并要求他等待2分钟。顾客已经不满意了,让他等待更加愤怒。他说”取消我的订单”,然后挂断了电话。敬畏上帝的Srinivas再次感到烦恼。

创意时间:Srinivas对此进行了更深入的思考。他也意识到这种情况也会发生在Raj身上。经过一段思考时间后… 哎呀!他找到了一个解决办法。第二天,他与Raj达成协议,在他们接受订单后立即交换订单详情。例如,订单编号223由Srinivas接受。他将拥有原始订单,并将订单详情的副本传递给Raj。同样,订单编号224由Raj接受,他将把副本传递给Srinivas。现在他们两个人都拥有了所有的订单详情。以后,如果顾客询问订单状态,他们可以在不让顾客等待的情况下回答。这就是”一致性”(Consistency)的体现。

第283天:到目前为止,一切都进展顺利。业务增长了好几倍。现在他有3个人负责接受订单,并且他建立了一个厨房。Srinivas和Raj不再从事这项工作。新的团队成员是Suma、Ramesh和Supriya。他们年轻、充满活力,毫不在乎。至于之前的流程,他们每个人都会向其他两个人更新订单信息。

第289天:一切都好好的,直到某一天。就像宝莱坞电影一样,Supriya爱上了Ramesh,而Ramesh爱上了Suma。事情开始变得复杂,Supriya开始感觉自己像个失败者。随着时间的推移,情况变得更糟。Ramesh和Suma都停止向Supriya传达订单详情,而Supriya也做同样的事情。这导致了沟通中断。现在基本上回到了第一天的状态。没有”分区容错性”(Partition tolerance)。唯一能够提供可用和一致服务的方法是要么摆脱Ramesh和Suma,要么摆脱Supriya,要么让他们一起工作。否则,你可以使系统”可用”,但数据不一致。

让我们回到我们的IT世界的现实。

CAP代表一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。

一致性(C):所有节点同时看到相同的数据。你写入的内容就是你读取的内容。

可用性(A):确保每个请求都能接收到成功或失败的响应。无论是读取还是写入,你都会收到一些响应。

分区容错性(P):即使在系统的一部分发生任意消息丢失或故障的情况下,系统仍然可以继续运行。即使节点之间的通信中断,系统仍然可以正常工作。

CAP定理经常被误解。它不是选择其中任意两个。关键在于分区容错性(P)对于客户来说是不可见的。它是一种技术解决方案,用于实现一致性(C)和可用性(A)。客户只能体验到一致性和可用性。

分区容错性是由电线、电力、软件和硬件驱动的,我们都无法控制,而且通常无法满足分区容错性。如果分区容错性存在,A和C就没有问题(除了延迟问题)。问题出现在分区容错性无法满足的情况下。现在我们有两个选择。

AP:当没有分区容错性时,系统可用,但数据不一致。

CP:当没有分区容错性时,系统不完全可用。但数据是一致的。

如果我在解释CAP定理时不提及著名的CAP三角形和一些流行的数据库,那将是一种遗憾。