微服务应用属于分布式系统的一种落地实践,而分布式系统的最大难题是处理各个节点之间数据状态的一致性,CAP原理就是描述分布式系统下节点数据同步的基本定理
CAP定理分别指Consistency(一致性)
、Availability(可用性)
、Partion toterance(分区容忍性)
这三种特性通常情况下不能同时满足。
(1)数据一致性
系统的数据信息(包括备份数据)在同一时刻都是一致的,在分布式系统中,同一份数据可能存在多个不同的实例中,在数据强一致性的要求下,对其中一份数据的修改,必须同步到它的所有备份中去,在数据同步的任何时候,都需要保证所有对该份数据的请求将返回同样的状态。
(2)服务可用性
服务在接收到客户端请求后,都能够给出响应。服务可用性考量的是系统的可用性,要求服务在高可用和部分节点宕机的情况下,系统整体依然能够响应客户端的请求。
(3)分区容忍性
在分布式系统中,不同节点之间通过网络进行通信,基于网络的不可靠性,位于不同网络分区的服务节点都可能会通讯失败,如果系统能够容忍这种情况,说明它是满足分区容忍性的,如果系统不能够满足分区容忍性,那将会限制分布式系统的扩展性,即服务节点的部署数量和地区将受限,违背了分布式系统的设计初衷,一般来讲分布式系统都会满足。
解释下为什么不能同时满足三个条件?
假设服务A现在有两个实例A1和A2,他们之间的网络通信出现异常,基于分区容忍性,并不会影响A1和A2独立的正常运行,若此时客户端请求A1,
请求将数据B从B1状态修改为B2,由于网络的不可用,数据B的修改并不能通知到A2实例,
如果此时另一个客户端向A2请求数据B,如果A2返回数据B1,将满足服务的可用性,但并不能满足数据一致性;
如果A2需要A1的通知之后才能返回数据B的正确状态,虽然满足了数据一致性,但无法响应客户端二点请求,违背了服务可用性的指标。
基于分布式系统的基本特质,分区容忍性是必须要满足的,接下来,需要考虑满足数据一致性还是服务可用性,这要取决于具体的应用场景,在类似银行对数据要求强的系统中,要优先考虑满足数据一致性;而类似大众网页的系统中,用户对网页版本的新旧不会有特别的要求,在这种情况下服务可用性高于数据一致性。