大聪明教你学Java | 一文带你了解 CAP 理论

152 阅读7分钟

前言

“我正在参加「掘金·启航计划」”

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。

🍊支持作者: 点赞👍、关注💖、留言💌~

前言

回想起大聪明刚毕业的时候,开发的都是单体应用,后来随着业务扩展,流量越来越大,单体应用扛不住高并发,就慢慢引入的分布式系统。分布式将业务拆分成子业务部署到不同的机器上,不同的机器节点通过网络进行通信,各个节点之间协作服务。随着时间的推移,分布式系统也越来越多,已经渐渐的替换掉了原来的单节点应用。不知道各位小伙伴在开发分布式系统的时候有没有听说过 CAP 理论呢?其实大聪明也不太了解什么是 CAP 理论,那么今天我们就一起看看分布式系统中的 CAP 理论... 🙇‍♂️

CAP理论

2000年7月,加州大学伯克利分校的 Eric Brewer 教授在 ACM PODC 会议上提出 CAP 猜想。2年后,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP。之后,CAP 理论正式成为分布式计算领域的公认定理。

以上内容来自百度👆

我们先来看看什么是 CAP 理论👇

CAP理论指的是一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

  • CAP 理论中的一致性指的是强一致性( Strong Consistency ),又叫线性一致性( Linearizable Consistency ),它要求多节点组成的分布式系统,能像单节点一样运作,如果一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有的读操作都不能读到这个数据。
  • CAP 理论中的可用性指的是要求系统提供的服务必须处于100%可用的状态,对于用户的每一个操作请求,系统总能够在有限的时间内返回结果。在这句话中我们可以抓到三个关键词:“ 100% 可用”、“有限时间内”、“返回结果”。

100% 可用: 100%可用指得是系统必须完全可用,不允许出现任何不可用的情况,当然了,这是一个非常非常理想的模型。

有限时间: 它指的是对于客户端的一个请求,系统必须在指定的时间内返回对应的请求结果,如果超过了这个时间,系统就被认为是不可用的。一般来说,有限时间的长短是系统在设计的时候,就设定好的系统运行指标,不同的系统之间会有非常大的差别。

返回结果: 这是指系统在完成对客户端请求的处理后,必须返回一个正常的响应结果。同时客户端可以根据这个响应结果,来明确判断这个请求执行成功还是失败,而不是返回一个让用户无法判断的不正常的响应结果。比如我们在淘宝上购买物品,我们支付完后,页面上会提示我们“支付成功,等待卖家发货”或者“余额不足”,如果返回了一个“系统内部错误”,那么这就是一个不正常的响应结果。

  • 在了解分区容错性之前,我们先看看什么是分区:分区指的是在整个分布式系统中,因为各种网络原因,系统被分隔成多个单独的部分,它不仅包含我们通常说的网络分区,也包含因为网络丢包导致的网络不通的情况。并且,这里说的因为网络丢包导致网络不通的情形,还包含节点宕机的场景,由于系统的其他机器不知道某个节点宕机了,只知道与宕机节点的网络是不通的,所以当节点宕机发生时,其他节点发往宕机节点的包也将丢失。CAP 理论中的分区容错性指的是分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。那么我们可以想想,在现实的分布式系统中,我们面对的就是一个不可靠的网络和有一定概率宕机的设备,这两个因素都会导致分区出现,因此在分布式系统实现中,分区容错性 P 则是一个必须项。如果我们的设计放弃分区容错性,就相当于我们认为节点之间的网络通信永远是好的,那么我们对节点之间的远程调用的结果,就不需要处理超时等网络层错误了。但是这样一来,看似是简化了系统设计,实际却忽视了超时等网络错误的情况。当它们出现后,系统的行为就是未定义的了,可能会出现崩溃、脏数据,甚至是出现更严重的问题。

我们现在已经了解了 CAP 原理中的三个要求,接下来我们回过头再看看 CAP 原理的概念,概念中提到了一句话:“只能满足三项中的两项”,这时候肯定有小伙伴会产生疑问:不能都满足吗?为什么只能满足两项呢?稍安勿躁,我们接着往下看👇

既然是分布式系统,那么就一定存在网络分区,那么网络中的各个服务器之间就有可能数据不一致。比如往A服务器中写入数据,B服务器由于网络原因没有把A服务器的数据同步过去,此时一旦向B服务器发送请求读取数据,也就不能读到数据或者读出来的是脏数据,所以在存在网络分区的情况下,数据是不可能完全保持一致的。同时我们也可以采用反证法来证明,如果三者可同时满足,则 P(分区容错性)是存在的,那么则一定存在服务器之间的丢包或者服务器宕机的情况,既然存在丢包或者宕机的情况,那就不能满足 C(一致性),所以可以证明 CAP 三者只能满足其二。所以在分布式框架中,要么是 AP 架构要么是 CP 架构,具体如何选择还是要看系统主要是负责什么样的业务,如果是金融类项目则更适用 CP 架构,如果是商城类项目则更适用 AP 架构。

其实在CAP理论提出十多年后,Eric Brewer 教授又出来辟谣:“三选二的公式一直存在着误导性,它会过分简单化各性质之间的相互关系”。其实我们仔细思考一下,这三种性质其实可以在某种程度上进行衡量,比如可用性显然是在0%到100%之间连续变化的;一致性又分很多级别,甚至连分区也可以细分为不同含义。所以,由此可见一致性和可用性并不是水火不容的,我们可以在不同的应用系统中找到一个不同的平衡点, 从而达到相对理想的状态 ( •̀ ω •́ )y。

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

爱你所爱 行你所行 听从你心 无问东西