CAP理论的理解
假设现在有一个客户端,两个服务端A,B,它们共同构成一个系统。
这时有一个变量,存在A机器上。那么由于只有一份数据,所以一致性是可以保证的,只要机器A不坏(默认情况),那么可用性也是可以保证的。这个时候等于选择了CAP中的一致性和可用性,放弃了分区容忍性,即不容忍分区,即不对这个变量在不同机器上做多个副本。
但是存在一种情况,服务端A坏了,只有一份的这个变量没了,系统直接崩了。我们肯定不愿意看见这个情况,为了解决这种情况,我们自然而然地想到把这个变量做副本,分别存在A和B两台机器上,这样不就更可靠了吗。在我们产生这个想法的时候,我们实际上进行了数据分区,也就是潜意识里选择了分区容忍性。这个时候客户端的请求经过负载均衡既可能到A,也可能到B。看起来好像很不错。但是这个时候,A和B之间网线断了,导致客户端对A中这个变量的写操作无法更新到B里去,这个时候客户端又访问了B,但是这个时候B中的这个变量是旧的啊,那么这就需要你做一个选择,是把B中这个旧值返回还是不返回。如果返回,那么恭喜你,系统可用性得到了保障,但用户拿到了旧数据,等于说放弃了一致性。如果不返回,这个时候放弃了可用性,但是用户不会拿到旧数据,等于说选择了一致性。
这就是本人的理解了,但是感觉在学这个概念的过程中,有很多地方把P翻译成分区容错性,让我走了很多弯路。相比之下,分区容忍性就说得更精确一些。分区容忍性简单说就是一个变量是否在多台机器上存储多分拷贝,在我们有多台机器的情况下,肯定放多个拷贝我们的系统才会更可靠。所以这也就是为什么那么多博客说一般情况下,我们会选择分区容忍性P,而在可靠性和一致性之间做一个选择。其实就是选择当不同拷贝由于网络故障不能更新为最新值的时候,你是否愿意把旧的数据返回给用户。