[分布式协议]CAP的理解 五分钟深入理解

首先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.

当出现网络分区后,系统能够继续“履行职责”。

什么叫运行呢?是有进程在吗?所以说描述的不准确.

履行职责是说可以正常提供服务!

 

CA

网络是不确定的,所以一定会造成分区,当网络分区时,写请求应该怎么处理,如果正常写入,那么不满足一致性,因为分区的机器肯定写不了;如果返回error,那么不满足可用性

所以不可能哟CA

CP:

如果发生网络分区,那么写入会受影响,返回error.

CA:

如果发生分区,可能发生故障的机器返回的不是最新数据.

 

CAP 关注的粒度是数据,而不是整个系统

所以同一个系统,可能不同数据是不一样的设计.

例如一个系统,可能账号数据是CP,用户信息是AP.   

 

CAP 理论是忽略延时的,而实际应用中延时是无法避免的

这一点就意味着完美的 CP 场景是不存在的,即使是几毫秒的数据复制延迟,在这几毫秒时间间隔内,系统是不符合 CP 要求的。因此 CAP 中的 CP 方案,实际上也是实现了最终一致性,只是“一定时间”是指几毫秒而已.

AP 方案中牺牲一致性只是指分区期间,而不是永远放弃一致性。

这一点其实就是 BASE 理论延伸的地方,分区期间牺牲一致性,但分区故障恢复后,系统应该达到最终一致性。

 

 

参考:

https://time.geekbang.org/column/article/9390?utm_term=zeusV2IJA&utm_source=dilan  阿里大牛,理解太透彻了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值