CAP理论
全称:Consistency & Availability & Partition tolerance,分别是一致性、可用性、分区容忍性,这是分布式架构当中最基础的理论。
以电商场景为案例帮助我们理解概念:
这是一个典型的读写分离场景
Consistency
一致性是指写操作后的读操作可以读取到最新的数据,当数据分布在多个节点,从任意节点读取的到的数据都是最新的。
以上图为例,商品信息如果需要做一致性保证的话,就要做满足如下要求:
- 商品服务写入主数据库成功,向从数据库的查询也必须是最新的数据
- 商品服务吸入主数据库失败,从数据也不能查询到新数据
如何保证一致性:
- 写入主数据后要保证数据能同步到从数据库
- 当数据写入主数据库中之后,在数据向从数据库同步的过程中,需要将从数据库锁定,待同步完成之后才能放开,以免出现数据写入主数据库之后,从数据库查询的还是旧数据
分布式系统实现一致性的特点:
- 由于从在数据的同步过程,写操作的响应会有一定的延迟
- 为了保证读取数据时最新的,也就是保证一致性,会对资源进行暂时的锁定,待数据完成后释放锁定的资源
- 如果请求数据在同步数据的时间段内,则优雅的返回错误信息,但是一定不能返回旧数据
Availability
可用性实质任何事务操作都可以的到响应结果,不会出现响应超时或者相应错误,优先保证服务的正常进行。
以上图为例,商品信息如果需要满足可用性的话,就要做满足如下要求:
- 从数据库接收到数据查询的请求,要立即能够响应数据查询结果,即使是旧数据
- 读取从数据不允许出现响应超时或者响应失败
如何保证可用性:
- 写入主数据库后一定要保证将数据同步到从数据
- 由于要保证从数据的读取不能出现响应超时或者响应失败,不能将从数据库中的资源锁定
- 即使数据没有同步完成,从数据库的读取也要能返回查询结果,即使是旧数据,如果连旧数据都没有,则要返回一个优雅的默认信息,坚决不能出现响应超时或者响应失败
分布式系统可用性的特点:
- 所有请求都有响应,优先保证数据的返回,不会出现响应超时或者返回错误
Partition tolerance
通常分布式系统的各个节点都部署在不同的子网(各地服务器),这就是网络分区,难免会出现由于网络问题导致的节点间通信失败,此时系统仍然要能够堆外提供服务,这就是分区容忍性。
以上图为例,商品信息如果需要满足分区容忍性的话,就要做满足如下要求:
- 主数据库向从数据库同部数据失败不影响读写操作(也就是即使同步失败,仍然能保证主数据库的写操作和从数据库的读请求)
- 其中一个节点挂掉不影响其他节点堆外服务
如何实现分区容忍性:
- 尽量使用异步架构取代同步操作,实现松耦合,不能因为一个业务调用链中的某一个节点异常,导致主业务操作失败。
- 尽量增加各个节点的实例,多主多从,保证每一个节点中一定有活着的服务
分区容忍性是分布式系统的基本能力
CAP的组合方式
所有分布式事务场景中不会同时具备CAP三个特性,由之前CAP介绍中可知,C和A是矛盾的不能共存的,P是最基本的能力。
AP
放弃一致性,追求分区容忍性和可用性,这是大多数场景下分布式系统设计的选择。
例如:
- 订单退款,退款成功了,但是钱会在几个工作日内到账,这个过程其实就是放弃了一致性,追求可用性
- 电商网站商品发布,虽然商品已经发布成功了,但是由于数据同步或者是缓存没有及时更新,商品列表可能要过几十秒甚至几分钟才能刷新出新的商品
CP
放弃可用性,追求强一致性和分区容忍性,分布式系统中经常用到的代表中间件zookeeper就是最求强一致的代表
例如:
- 银行转账,只要提示转账成功,那该次转账操作一定是完成的(现在注意到手机银行转账已经是2PC模式了QAQ)
CA
放弃容忍性,即不进行分区,只满足一致性和可用性。实际上这已经是一种垂直架构了,没有分布式的特性了。
不采用主从数据库,数据库可以响应每次查询请求,通过事务隔离级别实现每个查询都可以返回最新的数据。
总结
CAP是一个已经被证实的理论:一个分布式系统系统最多同时能满足一致性、可用性、分区容忍性的两种(其实CA没有P不算是分布式),可以作为架构设计的、技术选型的基础考量标准。对于现在大多数互联网应用场景,结合众多、部署分布,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,要保证服务的高可用的同时,并要达到良好的响应性能,因此一般都会选择AP。