cap的正确写法(简单易懂的CAP)
从这章开始会介绍下架构中涉及到的核心技术。主要是针对分布式系统的一些技术。CAP
CAP定理又叫布鲁尔定理,是一个叫Eric Brewer提出的。
CAP到底是什么,我们看看Wikipedia上是怎么解释的:
Consistency: Every read receives the most recent write or an errorAvailability: Every request receives a (non-error) response – without the guarantee that it contains the most recent writePartition tolerance: The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes--https://en.wikipedia.org/wiki/CAP_theorem
翻译下:
Consistency一致性,每次读都能返回最近的一次写或者是错误。
在可用的前提下能保证不管在分布式系统哪个节点读数据都是一致的;an error就是可能返回错误,这里就是不保证可用性。
Availability可用性:每次请求都能响应(非错误的响应),不能保证响应是最近一次写入的
保证任意时刻都能返回非错误的响应,不会超时,失败等错误响应。但是不保证一致性。
Partition tolerance分区容错性:在多个节点中即使有有网络延迟或者丢包的情况,也必须保证系统能正常运行。
总结这里再明确CAP定理的前提:是针对分布式系统提出的;有资源共享且涉及到读写。
为什么分布式系统只能保证CP或者AP了,因为分布式系统涉及网络通信,中间会出现网络故障的,所以P是我们要容忍的,就是说发生网络分区时系统能正常运行,这里的运行是系统不挂,有可能返回错误也是正常运行,这和A是不一样的,A是返回正确的响应。
会不会有疑问为什么不能保证CA?大家可以想一下,当发生网络故障的时候,如果需要保证C,那么系统就需要禁止写入,禁止写入就不能保证A了,这和CA就自相矛盾了。
最后,再看下我们怎么来保证CP和AP。
CP
图中我们可以看到server1和server2无法通信了,为保证C,这时候写操作就需要禁止了,读操作可以进行。因为如果允许写,把x修改成2了,但是server2这里x还是1,客户读取就读不到最近一次写入的数据,这时候就违背了CP。
Consistency: Every read receives the most recent write or an error
再看看这一句是不是明白了,为什么要强调返回最近一次写入的数据或者返回错误
AP
图中我们可以看到server1和server2无法通信了,为保证A,这时候读写操作都可以进行。假如server1把x修改成2了,但是server2这里的x还是1,客户读取在server2上还是会读取到1,但是没有返回错误响应,只是数据不一致,不是最新一次写入的数据。
Availability: Every request receives a (non-error) response – without the guarantee that it contains the most recent write
CA最后强调一下,是在发生网络故障的情况下,才会出现只能选择CP和AP的条件。如果系统正常,是可以保证CA的。
BASE顺便提下BASE。BASE指的是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)。BASE没有CAP要求那么严格。
CAP要求强一致性,而BASE要求最终一致性,就是说在网络故障的情况下,为了保证AP产生的数据不一致,等网络恢复后,数据可以根据一定规则达到最终一致性。比如刚才的AP模型,等网络恢复后,server2会根据规则把x变成2,从而达到最终一致性。
到底选择怎样的模型,还是需要根据业务来定。
希望对大家有所帮助,有帮助记得点赞哦!可以关注下,后面持续分享架构文章,谢谢!,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com