CAP定理的常规解释是任何分布式系统只能在一致性(Consitency),可用性(Availability)和分区容忍性(Partition Tolerance)中三选二。这个解释很让人费解,笔者在看了一些文章后谈谈我对它的理解,还请斧正。缓存
假设咱们用一台服务器A对外提供存储服务,为了不这台服务器宕机致使服务不可用,咱们又在另一台服务器B上运行了一样的存储服务。每次用户在往服务器A写入数据的时候,A都往服务器B上写一份,而后再返回客户端。一切都运行得很好,用户的每份数据都存了两份,分别在A和B上,用户访问任意一台机器都能读取到最新的数据。
这时不幸的事情发生,A和B之间的网络断了致使A和B没法通讯,也就是说网络出现了分区,那么用户在往服务器A写入数据的时候,服务器A没法将该数据写入到服务器B。这时,服务器A就必需要作出一个艰难的选择:服务器
这就是CAP定理试图解释的问题。网络
网络分区准确地说是指两台机器没法在指望的时间内完成数据交换。这不单单是指两台机器之间的网络彻底断开了,还可能有其余状况产生网络分区,好比对方机器宕机了,网络延时等状况。所以,在分布式系统中,一般是没法放弃Partition Tolerance的,也就只能在CP和AP之间作选择了。若是有个分布式系统号称是CA的,那必定是扯淡。架构
可用性和一致性之间的选择不是非此即彼的,而是根据业务的需求在它们二者之间作妥协。好比,咱们能够放弃对强一致性的追求,让其变成最终一致性,也就是说当服务器A不能把数据传给服务器B时,它先将数据缓存在其本地,等到网络恢复之后再将数据传给服务器B。这样,服务仍是可用的,只是在必定的时间窗口内二者的数据是不一致的。分布式
对网络分区的处理有如下几个步骤:ide
从图中可见(图片来自 InfoQ),系统最开始是处于一致的状态S,而后分区出现了,每一个分区的状态分别变成了S1和S2(这是为了保证系统的可用性,每一个分区继续响应客户端的请求)。接着,网络恢复后开始分区合并,将S1和S2状态合并成为新的一致状态S‘。是否是看起来和代码版本管理很相似?ui
其实CAP定理自己很简单,只是被人为地搞复杂了。简单地说,就是分布式系统中,架构师只能在一致性和可用性之间妥协。而复杂的是如何根据业务系统的须要在两者之间取舍,以及如何应对网络出现分区。spa