赞
踩
首先cap有两版,第一版是大家面试时候经常说的,第二版我觉得才是最准确的.参考
首先cap是针对的数据读写,不是所有功能,例如zk的选举.zk的数据复制都不是.
第一版:All nodes see the same data at the same time.
所有节点在同一时刻都能看到相同的数据.
第二版:A read is guaranteed to return the most recent write for a given client.
对某个指定的客户端来说,读操作保证能够返回最新的写操作结果.
差异点在于.第一版是针对于node来说,第二版针对client来说. 第一版是拥有的数据角度,第二版是读取的角度.那哪一个更准确呢?
我拿etcd举例,etcd大家都知道是cp系统,那etcd每个节点数据一定全都是最新的吗?不一定,因为leader把数据发送给follower后,就返回成功了.最起码可能有小于1/2个节点不是最新的.但是对于客户端来说,每次读取一定可以读取到最新数据(readIndex保证)
第一版:Every request gets a response on success/failure.
每个请求都能得到成功或者失败的响应。
第二版:A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).
非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)
差异:
第一版里啥是成功或者失败的响应,你请求任何节点都可以得到响应,超时/404/结果错误等等
第二版强调非故障节点返回合理响应.不一定是正确的或者是最新的.只要合理即可
第一版:System continues to work despite message loss or partial failure.
出现消息丢失或者分区错误时系统能够继续运行。
第二版:The system will continue to function when network partitions occur.
当出现网络分区后,系统能够继续“履行职责”。
什么叫运行呢?是有进程在吗?所以说描述的不准确.
履行职责是说可以正常提供服务!
网络是不确定的,所以一定会造成分区,当网络分区时,写请求应该怎么处理,如果正常写入,那么不满足一致性,因为分区的机器肯定写不了;如果返回error,那么不满足可用性
所以不可能哟CA
如果发生网络分区,那么写入会受影响,返回error.
如果发生分区,可能发生故障的机器返回的不是最新数据.
CAP 关注的粒度是数据,而不是整个系统
所以同一个系统,可能不同数据是不一样的设计.
例如一个系统,可能账号数据是CP,用户信息是AP.
CAP 理论是忽略延时的,而实际应用中延时是无法避免的
这一点就意味着完美的 CP 场景是不存在的,即使是几毫秒的数据复制延迟,在这几毫秒时间间隔内,系统是不符合 CP 要求的。因此 CAP 中的 CP 方案,实际上也是实现了最终一致性,只是“一定时间”是指几毫秒而已.
AP 方案中牺牲一致性只是指分区期间,而不是永远放弃一致性。
这一点其实就是 BASE 理论延伸的地方,分区期间牺牲一致性,但分区故障恢复后,系统应该达到最终一致性。
参考:
https://time.geekbang.org/column/article/9390?utm_term=zeusV2IJA&utm_source=dilan 阿里大牛,理解太透彻了
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。