CAP理论是啥?
一个大佬提出的,CAP是分布式系统的三个指标:
- 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。
- 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
- 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
虽然本人对分布式也是有一定程度的了解,但是看了上面的解释还是很蒙逼。虽然巨人已经在那里,但是想要爬上去还是很困难。对此我百度了几篇大佬的文章,CAP模型逐渐在我的脑海里生成,废话不说,先举个例子:
一致性:可以理解为 前后逻辑相符。
比如:小强有两个苹果,分给小明一个,再分给小红一个,这时小强还剩3个。啥?你会不会算术,这符合逻辑吗?很明显这前后逻辑不符,也就是不符合一致性。
其实不仅仅是算术,还有很多不符合逻辑的现象,比如今天天气很热,所以小明穿了一件大棉袄上学; 再比如小明肚子饿了,所以他不吃饭;等等都是前后逻辑不符,也就是不符合一致性。
可用性:其实也就是 “能用”。
比如:我用浏览器打开淘宝网,显示404错误,你可以说淘宝网目前不可用了,也就是没有可用性了。
再比如:我用浏览器打开淘宝网,网页可以正常打开。那么你可以说淘宝网是可用的。
再再比如:我用浏览器打开淘宝网,下单购买了一个苹果手机,当我点击“支付”后,浏览器显示"支付成功"!,那么我可以说淘宝网目前可以正常支付,也就是支付功能可用。
分区容忍性:可以理解为 能够忍受分布式系统节点间传输数据时出现的传输故障
目前如果想要使用分布式系统,你必须能够忍受服务之间传输时出现故障,这是不可避免的。原因很多,比如某个服务宕机,交换机换了,数据量太大,交换机传输延时高,等等。
如果你想跟她在一起,你必须忍受她的缺点,否则只能分手。
如果想要使用分布式,你必须忍受它的传输故障,否则只能放弃分布式,使用单体。呵呵!
CAP三者不可兼得:这又是为何?
举个例子:今天我打开淘宝买东西(马爸爸:“麻烦不要再黑淘宝,你去用用微信吧”),
- 我看上了一台iPhone11,目前库存有10台,我买了一台,点击购买按钮--输入收获地址-- 点击支付。
- 我点击付款后,我的付款请求到达了淘宝的 “订单服务器”,“订单服务器”马上修改我的订单状态 "未支付" 改成 “已支付”。
- 然后“订单服务器”发送了一条请求给 “商品库存服务器”,希望商品库存服务器将对应店铺的iPhone11的数量减1。
- 但是很不巧,出现传输故障(因为淘宝网站使用了分布式系统,所以传输故障偶尔会出现)
- 这时淘宝网有两个选择:
一:数据回滚,订单服务器 将我的订单状态回滚成“未支付”,浏览器返回"支付失败",what?支付系统不可用?---放弃 了可用性A
二:无视传输故障,商品库存没有改变,还是剩余10台,但是依然支付成功,订单状态为“已支付”, 啥? 店里本来有 10台苹果手机,卖了1台,还剩10台,前后不符合逻辑啊?---放弃了一致性C
从上面可以看出,在使用分布式,确定了分区容忍性后,如果出现传输故障,一致性 和 可用性 不可兼得。如果想要保证一致性,可用性必回降低,该如何抉择,或是有其它办法?下回分解