CAP 是由Brewer 在 90 年代提出,其核心内容是:在一个分布式存储系统里,无法同时保证一致性、可用性、分区容忍性,只能三选二。
不论面试官、还是研发人员,聊到分布式,必谈CAP理论。俨然一副,把CAP理论当做至理名言,懂CAP就是高手、就是大佬的样子。而在我看来,CAP理论其误导性,远大于其实际中的指导意义。所以我称它为:皇帝的新装。
在CAP理论里,甚至对于一致性、可用性、分区容忍性的准确定义,都存在不同的解读。更不用说,我们的系统并不是非黑即白的一致不一致、可用不可用、可容忍分区不可容忍分区。接下来,我们从把一个存储系统设计为分布式的目的开始,分析一下CAP理论。
首先,一个存储系统,设计成分布式的目的,除了获得更高性能外,更多的是为了更高的可用性(即CAP里的A)。
其次,要想使一个分布式系统达到高可用,必然得有对网络分区的容忍性(即CAP里的P)。如果分布式系统没有P,那就跟单节点没啥区别了,对吧?(这里不考虑性能原因)。所以在这里,A和P的关系是:为了获得A,我们不得不先有P。
接下来我们再看一致性。为了得到A,我们使用了分布式,且必须得有P。这必然会带来一致性的问题。如果我们要保持强一致性,则可用性会有所下降。注意这里说的是可用性下降,并不是没有。如果我们在一致性上退步,保持最终一致性即可,则可用性就会提高。
从以上分析视角来看:我们分布式系统的核心目的就是为了可用性,我们必须得有P。如果要A高一些,C就得退让一些,反之亦然。他们之间并非三选二的关系。
说到这,是不是可以联想到BASE理论?因为分布式系统必然有P,所以该理论并没有强调P,而是说了可用性A和一致性C。但该理论更准确的地方是,它没有把A和C非黑即白化,而是强调了基本可用性和最终一致性。
总的来说,CAP理论误导性和模糊性太大,甚至说它是错误的都没问题,因为CAP并不是一个三选二的关系。而是必须有P,然后在C和A之间玩跷跷板的关系。还是BASE理论更准确。