**CAP原则:**分布式系统设计非常重要的一个环节。学过的东西,特别是理论,很容易就会忘记,勤做笔记,加深理解。

分布式系统最大的难点:各个服务之间的状态如何同步,CAP是这一方面的基本定理,也是理解分布式系统的起点。

<mark>CAP:由三个字母组成,分别是C(Consistency)一致性,A(Availability)可用性,P(Partition tolerance)分区容错性。</mark>

  1. 一致性:指的是在分布式系统中,当读写的服务被分布在了不同的服务器上,此时如果我们访问服务器1进行写操作修改了一个字段的值,后台可能也会存在主从数据库,它们会对写入的数据进行数据库的主从同步。但写操作完成后,此时如果我们访问服务器2调用读服务,能否读到修改后最新的值

    如果能读到,这就是一致性的一种体现。但是事实上,并不能完全保证任何时间数据的一致性,也就是不能保证强一致性。原因是:在进行数据库同步的时候这个时间耗费了多少是未知的,还有可能读到旧的数据。

    所以通常我们只会去尽可能实现最终一致性,这种最终一致性指的是但我们要真正去读取数据的时候,要么读到的是最新的数据,要么就是报错,不可能读取到旧的数据。

  2. 可用性:

    可用性就相对比较强硬一点了,就是收到了用户的请求,服务器就必须做出响应。实现可用性往往会牺牲一致性,因为满足一致性必须满足的是,写完后的读操作,必须返回该值。这一过程受到往往会受到多方面的约束,例如网络延迟,所以就可能在数据库主从更新没有完成的时候读到旧的值,也就是破坏了一致性原则。

  3. 分区容错性

    分区指的是不同的服务器之间是跨网段通信的,这个通信方式是往往是存在带宽、延迟的风险,也就是不可避免会存在不同服务器之间不可通信的场景。也就是说,CAP的P是不可避免的。

一致性和可用性可以同时存在吗?

答案:不可以的!因为分区容错性一定会存在的,网络的问题是不可避免会存在的,如果真的想实现CA,则只适合用于单机的应用。

为达到一致性目的,我们通常会在实现数据库主从同步的时候,使用锁机制,在数据库数据库主从同步未完成的时候,不释放锁,这样读操作就不能进行响应(可用性遭到了破坏),真正数据库同步完成后,释放锁,一致性目的达到。

反之,可用性达到了,一致性就保证不了了。

小结:

所以说CAP原则,目前的分布式系统只能满足其中的两个CP、AP,典型的Zookeeper和Eureka实现也是基于CAP原则,不同的是Zookeeper遵循的是CP原则,更强调的是数据的一致性,Eureka遵循的是AP原则,强调的服务的可用性。

学习参考材料:

https://www.bilibili.com/video/BV1KT4y1A7Uf/?spm_id_from=333.788.recommend_more_video.17
https://www.bilibili.com/video/BV1FJ411A7mV?p=5
http://www.ruanyifeng.com/blog/2018/07/cap.html

理解不到位的地方,还请各位观看的大爷批评指出哈😂