CAP 原则指的是,分布式系统中三个要素一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)最多只能同时实现两点,不可能三者兼顾。
1 前提共识
- CAP原则不是要求每个节点的数据都一样(不是集群);
- 分布式系统对外的服务,只是某一个节点,节点之间是内部通信;
2 分区容错性
分区指的是分布式系统的一个节点,如果需要满足分区容错性,意思是因为某些网络、故障原因,我这个节点上没有收到其他节点的一致性通知(不一定是数据同步),比如A、B两个节点,A负责生成订单,B负责短信发送,A生成订单之后,给B发一个信息告诉可以B可以进行短信发送了,但是某些原因B没有收到,也就没有发送短信,这对于业务来说,是不能容忍的,因为我生成了订单,但是没有给用户发短信,这就不满足分区容错性。
为了保证分区容错性,那么系统就强要求A和B必须保证逻辑一致,就是说B必须等到A的生成订单才发短信,并且B没有发短信这次请求就算失败的,类似于事务。
这种场景满足了分区容错性P,满足了一致性C,但是在数据同步期间,服务是不可用的,因为要等同步完成才能用,不满足A;
3 可用性
同样上面的场景,如果我需要满足可用性A,也就是说我在数据同步期间也能访问系统,类似于MySQL的主从复制,在数据从主到从同步期间,服务也是可用的,并且容忍了分区之间的错误(不一致),这种就满足了A和P,但是这时候数据就有不一致性;
4 一致性
为了解决一致性和可用性的问题,很简单,我不使用分布式就可以了,数据和服务全部在单节点上,满足了C和A,既然都没有了分区,那么更没有分区容错性而言了。