为什么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不一致,一致性
无法保证。
所以,可以看出,分区容错的前提下,一致性
和可用性
是矛盾的。