CAP理论

分布式系统设计一般要考虑三个核心要素 - - CAP

  1. 一致性(Consistency): 同一时刻同样的请求的不同实例返回的结果相同,这要求数据具有强一致性(Strong Consistency)。

  2. 可用性(Availability): 所有读写请求在一定时间内得到正确的响应

  3. 分区容错性(Partition tolerance): 在出现网络异常的情况下,系统仍然能正常工作

CP 还是 AP?

在分布式系统来说,在保证分区容错性(P)的条件下,一致性(C)和可用性(A)是不能同时满足的,举个例子:

读写分离,某个节点负责写入数据,然后将数据同步到其它节点,其它节点提供读取的服务,当两个节点出现通信问题时,你就面临着选择A(继续提供服务,但是数据不保证准确),C(用户处于等待状态,一直等到数据同步完成)。

如果要保证一致性(C),即所有节点可查询到的数据随时随刻都是一致的(同步中的数据不可查询),就要求一个节点写入数据后必须再将数据写入到另一个节点后才能返回成功,这样当我们读取之前写入的数据时才能确保一致,但上文说明过网络异常在所难免,如果两个服务节点无法相互通讯时为保证一致性在数据写入发现无法同步到另一节点时就会返回错误进而牺牲了可用性(A)。

如果要保证可用性(A),即只要不是服务宕机所有请求都可得到正确的响应,那么在网络异常节点不能通讯的情况下要让数据没有同步到另一节点的请求也返回成功,这就必须牺牲一致性(C)导致在一段时间内(网络异常期间)两个服务节点所查询到的数据可能不同。
所以从中可以简单地发现一致性(C)与可用性(A)是不可能同时满足的。同FLP Impossibility 一样CAP理论也为我们做分布式服务架构指明了方向:分布式系统中我们只能选择CP(满足一致性牺牲可用性)或AP(满足可用性牺牲一致性)。

所以分布式系统设计要考虑的是在满足P的前提下根据业务需求选择CP还是AP。

常用的EurekaZookeepr实现,Eureka是AP的,Zookeeper是CP的