目录
[CAP 理论的基础名词](#CAP 理论的基础名词)
[BASE 理论](#BASE 理论)
CAP 理论的基础名词
C:一致性 所有节点访问的都是同一份最新的数据副本
A:可用性 非故障的节点能在合理的时间内返回合理的响应
P:分区容错性 分布式系统出现网路分区的时候仍然能对外提供服务
注:分布式系统中,多个节点之间的网络本来是互通的,但是由于某些故障,比如说某些节点网络出现了问题,网络不互通后,整个网络就会出现被分成几块区域的情况,这就叫网络分区
理论的具体内容
对于一个分布式系统 , 我们在设计读写操作时
只能同时满足 C A P 中的两个
当发生网络分区的时候,如果我们要继续服务,那么在一致性和可用性里面我们只能选一个
所以理论上我们是不能选择 CA 架构的
选择的是 CP 或者是 AP 架构
CP : 在分布式系统能处理分区容错性的基础上满足一致性
AP:在分布式系统能处理分区容错性的基础上满足利用性
C A 时两个冲突的 如果发生了网络分区 那么满足 C 的话 要禁止其他分布式节点 即违反了 A
举例
Dubbo
架构图

我们这边的 dubbo 注册中心 Registry 时扮演了什么样的服务呢
注册中心只负责服务地址的注册与查找 相当于一个目录服务 生产者和消费者只在启动时与注册中心交互
注册中心实际上不负责服务的转发,压力比较小
主流注册中心的比较
Zookeeper 保证的是 CAP 理论中的 CP 即在分区容错性的基础上满足一致性
我们在任意时刻对 Zookeeper 对读请求都能读取到一致的结果
但是在 Leader 选举过程中服务不可用
而且会出现半数机器不用用时服务就会挂掉
Eureka 保证的是 CAP 理论中的 AP 即在分区容错性的基础上满足可用性
不存在什么 Leader 节点 所有节点都是一样的 只不过所有节点上的数据可能会不一致
Nacos 即支持 CP 也支持 AP
总结
在进行分布式系统的设计与开发中 我们更应该考虑的是系统的拓展性,可用性
首先我们要考虑是否会发生网络分区,就是各节点网络问题
如果发生了网络分区就要想办法保证 P 结合业务 在 P 的基础上在考虑该实现 C 还是 A
C 是一致性 A 是可用性
如果未发生网络分区我们要想的是如何尽可能的保证 CA
BASE 理论
BASE 理论是对 CAP 理论的延伸和补充,更加具体的来说 BASE 理论是对 AP 方案的一个补充
AP :在保证分区容错性的基础上保证的是可用性
BA :基本可用
S:软状态
E:最终一致性

BASE 理论的精髓在于
AP 只是在系统发生网络分区的时候放弃一致性,而不是永远放弃一致性
在分区恢复后还是要满足一致性
软状态就是指的是 发生网络分区后一段时间内的状态 可能是不一致的
但我们要达到最终一致性 而并不需要实时的保证数据的强一致性
达到最终一致性的方法
- 读时修复 : 在读取数据时,检测数据的不一致,进行修复。比如 Cassandra 的 Read Repair 实现,具体来说,在向 Cassandra 系统查询数据的时候,如果检测到不同节点的副本数据不一致,系统就自动修复数据。
- 写时修复 : 在写入数据,检测数据的不一致时,进行修复。比如 Cassandra 的 Hinted Handoff 实现。具体来说,Cassandra 集群的节点之间远程写数据的时候,如果写失败 就将数据缓存下来,然后定时重传,修复数据的不一致性。
- 异步修复 : 这个是最常用的方式,通过定时对账检测副本数据的一致性,并修复。