什么是CAP定理
一 CAP是什么?
要了解CAP是什么,要看下面这张图:
分别解释一下:
- C: 一致性,一致性C代表更新操作成功后,所有节点在同一时间的数据完全一致。
- A:可用性,可用性A代表用户访问数据时,系统是否能在正常响应时间返回预期的结果。
- P: 容错性,分区容错性P代表分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。
我们假设一个场景,电商系统下订单和扣减库存的操作,在微服务时代,其被划分到了两个项目,两者之间需要网络通讯来数据交流,如下:
其必然存在的问题就是,假如我新建订单之后,网络问题导致库存减少失败,就产生了不一致的情况。
所以在现在的情况下,我们的设计一定需要遵从一致性,无论是即时的一致性还是最终一致性,CP都是必不可少的。
假如是AP:
AP表现为订单创建后不等待库存减少直接返回处理结果
优点: 用户等待时间较少
缺点: 可能导致数据不一致
假如是CP:
CP表现为订单创建后一直等待库存减少后才返回结果
优点:数据保证了一致性
缺点:可能会有延迟以及用户体验不佳
假如是AC:
AC表现为不再拆分数据系统,在一个数据库的一个事务中完成操作,也就是单体应用。
通过个人对CAP的理解:
例如zookeeper的崩溃恢复模式以及原子广播模式都是为了保证CP,即数据的一致性。
zookeeper在某些节点宕机的时候,会暂时停止对外服务,采取一系列的措施,先恢复自己的主从节点,例如根据选举超过半数确定主,通过txid来确保数据最新,然后同步数据等操作,集群恢复之后,才会继续接受请求并处理。
那么假设zookeeper是AP,他会怎么做?
既然要可用,即就算我的一部分节点宕机,我仍然会让我还存活的节点处理消息,但是我不能保证我当前的消息一定是最新的或者正确的,但是服务一定是可用的。
那么你可以想想,redis是ap还是cp?