























任何网络都是不可能始终可达,一定会出现通信失败的情况,这时通信双方在网络上像被割裂开来了,形成不同分区。
我们必须允许通信失败的情况,做到这种分区情况的容错性,因为这是无法避免的,所以三者之中必须有P,那么就是说C和A无法同时达到
一致性是指系统内部所有节点数据和状态保持一致,你在系统中一个节点中写了数据,那么可以从其他节点读到该数据。
可用性是指系统中的节点应该始终能对外提供服务,保持可用。
为什么C和A不能同时达到呢?就是因为通信可能会失败(即分区容错),无法达到百分之百通信成功。

如图所示,在理想情况下,client往G1写数据,然后G1立马向G2通信来同步数据,那么client之后去G2就能读到该数据,这时可以同时满足CAP了。
但是如果通信失败,那么在当前,G1和G2数据不同步,达不到一致性,而如果把G2剔除或禁止G2对外提供服务直到通信成功,那么此时对于外界来说,这个分布式系统还是一致的,但这时G2就没有可用性了。
通信失败是无法避免的,所以CAP只能最多实现其中两样,也就是C和A任选一样。
但这个只是说严格的C和A,也就是强一致性和完全可用性无法同时达到,但一致性其实是有不同级别的:
互联网大部分应用其实只需要高可用性和最终一致性而已,失败之后重试直到成功,那么这样最终达到了一致性以及始终的可用性,但代价是中间存在一段时间的不一致性,当然也要求操作是幂等的
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。