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

那么分区容错性(P)就必须要满足,因为如果要牺牲分区容错性,就得把服务和资源放到一个机器,或者一个“同生共死”的集群,那就违背了分布式的初衷。
那么满足分区容错的基础上,能不能同时满足一致性和可用性?
假如现在有两个分区N1和N2,N1和N2分别有不同的分区存储D1和D2,以及不同的服务S1和S2。
- 在满足
一致性的时候,N1和N2的数据要求值一样的,D1=D2。 - 在满足
可用性的时候,无论访问N1还是N2,都能获取及时的响应。
假如现在有这样的场景:
- 用户访问了N1,修改了D1的数据。
- 用户再次访问,请求落在了N2。此时D1和D2的数据不一致。
接下来:
- 保证
一致性:此时D1和D2数据不一致,要保证一致性就不能返回不一致的数据,可用性无法保证。 - 保证
可用性:立即响应,可用性得到了保证,但是此时响应的数据和D1不一致,一致性无法保证。
所以,可以看出,分区容错的前提下,一致性和可用性是矛盾的。