什么是CAP定理

一 CAP是什么?

要了解CAP是什么,要看下面这张图:

![image](images/tlTAMljJXPfCE882f5HA3BmteiGl2wkVDbIFo238BXc.png)

分别解释一下:

  1. C: 一致性,一致性C代表更新操作成功后,所有节点在同一时间的数据完全一致。
  2. A:可用性,可用性A代表用户访问数据时,系统是否能在正常响应时间返回预期的结果。
  3. P: 容错性,分区容错性P代表分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。

我们假设一个场景,电商系统下订单和扣减库存的操作,在微服务时代,其被划分到了两个项目,两者之间需要网络通讯来数据交流,如下:

![image](images/bYPqR2hVcH70s8vUsE86N4KuLvOIMcqDkFJXBS3ahpo.png)

其必然存在的问题就是,假如我新建订单之后,网络问题导致库存减少失败,就产生了不一致的情况。

所以在现在的情况下,我们的设计一定需要遵从一致性,无论是即时的一致性还是最终一致性,CP都是必不可少的。

假如是AP:

AP表现为订单创建后不等待库存减少直接返回处理结果

优点: 用户等待时间较少

缺点: 可能导致数据不一致

假如是CP:

CP表现为订单创建后一直等待库存减少后才返回结果

优点:数据保证了一致性

缺点:可能会有延迟以及用户体验不佳

假如是AC:

AC表现为不再拆分数据系统,在一个数据库的一个事务中完成操作,也就是单体应用。

通过个人对CAP的理解:

例如zookeeper的崩溃恢复模式以及原子广播模式都是为了保证CP,即数据的一致性。

zookeeper在某些节点宕机的时候,会暂时停止对外服务,采取一系列的措施,先恢复自己的主从节点,例如根据选举超过半数确定主,通过txid来确保数据最新,然后同步数据等操作,集群恢复之后,才会继续接受请求并处理。

那么假设zookeeper是AP,他会怎么做?

既然要可用,即就算我的一部分节点宕机,我仍然会让我还存活的节点处理消息,但是我不能保证我当前的消息一定是最新的或者正确的,但是服务一定是可用的。

那么你可以想想,redis是ap还是cp?

Last modification:July 5, 2022
If you think my article is useful to you, please feel free to appreciate