尬聊CAP定理

粗浅的谈谈自己对CAP定理的理解,如有错误之处,请同学们指正。

学过关系型数据库,比如Mysql的同学一定知道事务的四大特性,A(原子性)、C(一致性)、I(隔离性)、D(永久性)。对于一个Mysql服务进程而言,不同的事务可以看做是不同的线程。事务的四大特性是确保了不同的事务之间数据访问的一致性,也就是确保了线程之间数据访问的一致性。

随着分布式、微服务的发展,服务往往不再是单一工作的,而是多个服务一起组成了集群。此时,数据之间的一致性由单进程的线程与线程之间,变成了多进程的进程与进程之间。显然这样的场景,ACID是无法满足需求的。那如何才能保证进程与进程之间的数据一致性,也就是分布式一致性,于是出现了CAP定理

CAP,即C:强一致性,A:可用性,P:分区一致性。

如上图所示,有一个情报中心,三个收信点,还有一群负责传达信件的邮递员。情报中心负责截获敌人的信息,然后将信息通知到三个收信站点。为了保证消息的真实性,前提是必须要等到三个收信点都得到了消息,这条消息才能被邮递员发送出去。在这里,可以将情报中心看作集群中的Master,三个收信点看作集群中的Slaver,也叫Follower,邮递员看作是一个个访问者,也叫服务消费者。

情报中心会不停的将消息分别传送到三个收信点,然后收信点等待邮递员取消息将消息邮递出去。此时有两种模式:

(1)一条消息,要等到三个收信点都得到了,才能被邮递员发送出去。这样要保证消息的一致性,避免只有一个收信点收到消息,造成消息的不确定性。但此时就会造成邮递员的闲置等待,造成了邮递员任务的不可用性。(满足C,不满足A)

(2)一条消息,只要有一个收信点收到,邮递员就可以将其传递出去。这样就让邮递员充分的利用起来,可用性满足了。但是会造成消息的不一致性。(满足A,不满足C)

对于P是保证传递消息的可靠性与安全性,这是必须要满足的条件,即不存在拜占庭将军问题,你想想,如果消息都无法保证能够从情报中心被送到收信点,那将会多么危险(满足P)

CAP无法共同满足,P是必须要满足的,于是很多服务有所取舍,要么CP、要么AP。

关于P必须满足,就是通信必须可靠,服务与服务之间的连接、数据传输必须是可靠的。如果这一点都无法满足,那数据一致性是根本不可能实现的。

关于C和A,因为数据都是通过网络实现传输的,这样势必会有延迟的问题。服务A将数据传输给服务B、服务C花费的时间也未必相同。既然存在延迟,如果要满足强一致性(即满足C),就要等到数据都传输完毕了才能对外提供服务,那数据传输的这一段时间就不能对外提供服务了,造成 了一段时间的服务不可用性(不满足A)。但是,如果为了满足可用性,让服务每时每刻都能对外提供服务,就要尽量减少数据传递之间的延迟,此时可以通过不需要所有的服务数据都还没有同步完成时,也能对外提供服务,但是这样就会造成数据的不一致性。有可能数据在服务A上,还没来得及同步到服务B,用户就访问了服务B,结果肯定是数据不一致的。

个人感觉,对于CP或AP,就是看你是更在乎数据传输之间的延迟问题,还是更在乎数据之间的一致性问题了。因为数据传输与同步之间的延迟性,如果追求数据一致性,必然会因为延迟造成一段时间的可用性降低。如果追求可用性,必然就要解决延迟性问题,那么需要放弃一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值