架构设计之 CAP 定理

在计算机领域,如果是初入行就算了,如果是多年的老码农还不懂 cap 定理,那就真的说不过去了。cap可是每一名技术架构师都必须掌握的基础原则啊。
现在只要是稍微大一点的互联网项目都是采用 分布式 结构了,一个系统可能有多个节点组成,每个节点都可能需要维护一份数据。那么如何维护各个节点之间的状态,如何保障各个节点之间数据的同步问题就是大家急需关注的事情了。
cap定理是分布式系统中最基础的原则。所以理解和掌握了cap,对系统架构的设计至关重要。
一、什么是 cap?
「 cap定理 」又被称为 布鲁尔定理,它提出对于一个分布式系统而言,不能同时满足以下三点:
consisteny(一致性)
availability(可用性)
partition tolerance(分区容错性)
也就是说cap定理指明了,任何分布式系统只能同时满足这三项中的两项。
如上图,如果是最多同时满足两项,那我们可以有三个组合:ca、cp、ap。在聊这三个组合之前,我们先分别看一下 consisteny(一致性)、availability(可用性)、partition tolerance(分区容错性)的含义。
假设某个系统当前有两个节点a和b,两个节点分别可以由actor进行读写,两个节点之间的数据会自动完成同步。
consisteny(一致性)
一致性的要求是指,对于任何客户端(上图actor)来说,每次的读操作,都能获得最新的数据。即,当有客户端向a节点写入了新数据之后,其它客户端从b节点中进行读操作所获得的数据必须也是最新的,是与a节点数据保持一致的。
availability(可用性)
可用性的要求是指,每个请求都能在合理的时间内获得符合预期的响应(不保证获取的结果是最新的数据)。
按照上图来看就是,客户端只要向a节点或b节点发起请求后,只要这两个节点收到了请求,就必须响应给客户端,但不需要保证响应的值是否正确。
partition tolerance(分区容错性)
分区容错性是指,当节点之间的网络出现问题之后,系统依然能正常提供服务。
讲完了c、a、p的含义和要求,我们继续来看看它们之间如何组合使用。
二、cap 怎么应用?
先把视野回到这张图上:
虽然我们知道有 ca、cp、ap 三种组合方式,但是在分布式系统的结构下,网络是不可能做到100%可靠的。既然网络不能保证绝对可靠,那 p(分区容错性)就是一个必选项了。原因如下:
如果选择 ca组合,放弃 p(分区容错性)。还是以最上面的图中a和b节点来举例,当发生节点间网络故障时,为了保证 c(一致性),那么就必须将系统锁住,不允许任何写入操作,否者就会出现节点之间数据不一致了。但是锁住了系统,就意味着当有写请求进来的时候,系统是不可用的,这一点又违背了 a(可用性)原则。
因此分布式系统理论上是不可能有ca组合的,所以我们只能选择 cp 和 ap组合架构。
下面我们来详细看一下 cp架构 和 ap架构的特点:
cp 架构
cp架构即 consisteny(一致性)与 partition tolerance(分区容错性)的组合。
如上图,由于网络问题,节点a和节点b之前不能互相通讯。当有客户端(上图actor)向节点a进行写入请求时(准备写入message 2),节点a会不接收写入操作,导致写入失败,这样就保证了节点a和节点b的数据一致性,即保证了consisteny(一致性)。
然后,如果有另一个客户端(上图另一个actor)向b节点进行读请求的时候,b请求返回的是网络故障之前所保存的信息(message 1),并且这个信息是与节点a一致的,是整个系统最后一次成功写入的信息,是能正常提供服务的,即保证了partition tolerance(分区容错性)。
上述情况就是保障了cp架构,但放弃了availability(可用性)的方案。
ap 架构
ap架构即 availability(可用性)与 partition tolerance(分区容错性)的组合架构。
如上图,由于网络问题,节点a和节点b之前不能互相通讯。当有客户端(上图actor)向节点a进行写入请求时(准备写入message 2),节点a允许写入,请求操作成功。但此时,由于a和b节点之前无法通讯,所以b节点的数据还是旧的(message 1)。当有客户端向b节点发起读请求时候,读到的数据是旧数据,与在a节点读到的数据不一致。但由于系统能照常提供服务,所以满足了availability(可用性)要求。
因此,这种情况下,就是保障了ap架构,但其放弃了 consisteny(一致性)。
三、cap 注意事项?
了解了cap定理后,对于开发者而言,当我们构建服务的时候,就需要根据业务特性作出权衡考虑,哪些点是当前系统可以取舍的,哪些是应该重点保障的。
即使是在同一个系统中,不同模块的数据可能应用的cap架构都是不同的。举个例子,在某个电商系统中,属于用户模块的数据(账密、钱包余额等)对一致性的要求很高,就可以采用cp架构。而对于一些商品信息方面的数据对一致性要求没那么高,但为了照顾用户体验,所以对可用性要求更高一些,那么这个模块的数据就可以采用ap架构。
另外,虽然上面第二节讲到过我们只能选择cp和ap,无法选择ca。但这句话成立的前提条件是在系统发生了网络故障的情况下。然而,网络故障的概率在系统的整个生命周期中占比是很小的,因此我们在设计的时候,虽然要考虑网络问题下的方案,但也要考虑网络正常情况下的方案,即在网络正常情况下,ca是可以实现的,我们也需要去保证在绝大多数时间下的ca架构。
再者,即使我们按照cap定理,三个中只能取其二,但不代表我们只需要保障其中的两点,而完全的放弃第三点,我们应该为不能保障的第三点也做一些防备措施或者冗余方案,来使系统更加的完善健全。
以上,就是对cap定理的一些思考。

比特币期货平台Bakkt为消费者推出了支付应用程序
二次回路的分类
Redmi和小米正在迎接下一代高通旗舰平台骁龙875
华为P10闪存事件持续发酵, 这是要把机会让给小米6吗?
国内首个工业级精迅V1单目/双目结构光3d重建软件使用场景
架构设计之 CAP 定理
悠易互通CDP荣获【2021科睿创新奖年度影响力平台】
首都网络安全日在北京展览馆拉开帷幕 网络安全同担网络生活共享
人工智能如何造就抗疫的神器
oppor11s和iphone7哪个好? 配置参数对比分析
三极管放大电路输入电阻和输出电阻的估算
如何对typo 进行检测和纠正
工业机器人的发展将会越来越智能
戴尔北京首发OPhone手机 近期将推TD版
GPU Render Engine详细介绍
热电偶是温度传感器吗 温度传感器热电阻和热电偶的区别
曲道奎:汽车销量下滑影响工业机器人发展,未来机器人替代率将达30%
骏成科技夫妻两人控股超过95%,上市前解除对赌协议
华为Mate10什么时候上市?华为Mate10最新消息:全屏幕,麒麟970,拍照提升
苹果的远程电容接口专利曝光,一种用于iPad键盘的新设计