为什么CAP不可兼得呢?

首先对于分布式系统,分区是必然存在的,所谓分区指的是分布式系统可能出现的字区域网络不通,成为孤立区域的的情况。

fenbushi-49bf971a-63ae-4b45-bb9e-8af84dff7219.png

那么分区容错性(P)就必须要满足,因为如果要牺牲分区容错性,就得把服务和资源放到一个机器,或者一个“同生共死”的集群,那就违背了分布式的初衷。

那么满足分区容错的基础上,能不能同时满足一致性可用性

假如现在有两个分区N1N2,N1和N2分别有不同的分区存储D1和D2,以及不同的服务S1和S2。

  • 在满足一致性 的时候,N1和N2的数据要求值一样的,D1=D2。
  • 在满足可用性的时候,无论访问N1还是N2,都能获取及时的响应。

假如现在有这样的场景:

  • 用户访问了N1,修改了D1的数据。
  • 用户再次访问,请求落在了N2。此时D1和D2的数据不一致。

接下来:

  • 保证一致性:此时D1和D2数据不一致,要保证一致性就不能返回不一致的数据,可用性无法保证。
  • 保证可用性:立即响应,可用性得到了保证,但是此时响应的数据和D1不一致,一致性无法保证。

所以,可以看出,分区容错的前提下,一致性可用性是矛盾的。

标签: java, Java面试题, 分布式, Java问题合集, Java编程, Java问题精选, Java常见问题, 分布式面试题