小白学分布式开发5——CAP理论

来源:互联网 发布:迪马利亚在巴黎数据 编辑:程序博客网 时间:2024/06/09 19:27
今天我们来学分布式系统中CAP理论吧~

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



程序猿小白:一致性、可用性和分区容错性是什么意思呢?
 
Consistency 一致性
一致性指"all nodes see the same data at the same time",即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。
对于一致性,可以分为从客户端和服务端两个不同的视角。
从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。
从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。
一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。
从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。
 
攻城狮小明:比如说淘宝搞大促销某一件热门商品减价销售,有很多人去抢同一件商品.这时候商品销售订单生成和减库存操作是在不同的分布式系统上.数据之间必须要一致.购物狂用最快的速度点击那个立即购买.购买的时候检查库存,要么购买成功库存-1,要么余货不足购买失败.不能这边用户下单了付款了,那边库存的数据还没有更新.导致用户订单成功却没有商品,逛了个假淘宝.

Availability 可用性
可用性指"Reads and writes always succeed",即服务一直可用,而且是正常响应时间。
对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。也就是,该系统使用的任何算法必须最终终止。当同时要求分区容错性时,这是一个很强的定义:即使是严重的网络错误,每个请求必须终止。
好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。可用性通常情况下可用性和分布式数据冗余,负载均衡等有着很大的关联。
 
攻城狮小明:AB两个程序猿共同写一个程序,一开始两个人兴致满满的分好了各自的任务.然后开始写了,B程序猿做的慢一点,然后A发现自己的任务里有一个功能依赖B程序猿的一个功能,而B程序猿还没有开始写.这时候A只有等B写完,提供了这个功能之后才能继续.结果项目周期就被拉长了,这就是为了相同的代码进度(一致性)而造成的类用户可用性体验问题.

Partition Tolerance分区容错性
分区容错性指"the system continues to operate despite arbitrary message loss or failure of part of the system",即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。分区容错性和扩展性紧密相关。
在分布式应用中,可能因为一些分布式的原因导致系统无法正常运转。好的分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,或者是机器之间有网络异常,将分布式系统分隔为独立的几个部分,各个部分还能维持分布式系统的运作,这样就具有好的分区容错性。

攻城狮小明:一个分布式系统中某一个服务器因为bug或者是其他原因宕机,如果整个都停掉,代价非常大.这时候可以采取折中的办法,想想吧,你开发了一款游戏,非常火爆,经常有土豪疯狂氪金,突然有一天,虚拟币加值系统宕机了(被攻击了?),但是充值系统正常工作.这时候你可以继续开放充值接口来吸金,事后再恢复虚拟币加值系统.岂不美哉!


别忘了关注我们的微信公众号!谢谢*o*!