微服务篇之分布式系统理论

一、CAP定理

1.什么是CAP

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:

  1. Consistency(一致性)。

  2. Availability(可用性)。

  3. Partition tolerance (分区容错性)。

Eric Brewer 说,分布式系统无法同时满足这三个指标。 这个结论就叫做 CAP 定理。

2.一致性

**Consistency(一致性):**用户访问分布式系统中的任意节点,得到的数据必须一致。

3.可用性

**Availability (可用性):**用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝。

4.分区容错

**Partition(分区):**因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。

**Tolerance(容错):**在集群出现分区时,整个系统也要持续对外提供服务。

5.结论

  1. 分布式系统节点之间肯定是需要网络连接的,分区(P)是必然存在的

  2. 如果保证访问的高可用性(A),持续对外提供服务,但不能保证数据的强一致性--> AP

  3. 如果保证访问的数据强一致性(C),就要放弃高可用性 --> CP

二、BASE理论

BASE理论是对CAP的一种解决思路,包含三个思想:

B asically A vailable (基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。

S oft State**(软状态)**:在一定时间内,允许出现中间状态,比如临时的不一致状态。

E ventually Consistent**(最终一致性)**:虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

三、面试题

面试官:什么是CAP理论?

候选人

CAP主要是在分布式项目下的一个理论。包含了三项,一致性、可用性、分区容错性:

  • 一致性(Consistency)是指更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致(强一致性),不能存在中间状态。

  • 可用性(Availability) 是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。

  • 分区容错性(Partition tolerance) 是指分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

面试官:为什么分布式系统中无法同时保证一致性和可用性?

候选人

首先一个前提,对于分布式系统而言,分区容错性是一个最基本的要求,因此基本上我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取舍。

如果保证了一致性(C):对于节点N1和N2,当往N1里写数据时,N2上的操作必须被暂停,只有当N1同步数据到N2时才能对N2进行读写请求,在N2被暂停操作期间客户端提交的请求会收到失败或超时。显然,这与可用性是相悖的。

如果保证了可用性(A):那就不能暂停N2的读写操作,但同时N1在写数据的话,这就违背了一致性的要求。

面试官:什么是BASE理论?

候选人

嗯,这个也是CAP分布式系统设计理论。

BASE是CAP理论中AP方案的延伸,核心思想是即使无法做到强一致性(StrongConsistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。它的思想包含三方面:

1、Basically Available(基本可用):基本可用是指分布式系统在出现不可预知的故障的时候,允许损失部分可用性,但不等于系统不可用。

2、Soft state(软状态):即是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

3、Eventually consistent(最终一致性):强调系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。其本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

相关推荐
救救孩子把7 分钟前
深入理解 Java 对象的内存布局
java
落落落sss10 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
万物皆字节15 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭22 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由29 分钟前
速成java记录(上)
java·速成
一直学习永不止步34 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明35 分钟前
面试知识储备-多线程
java·面试·职场和发展
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
煸橙干儿~~1 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
2401_854391081 小时前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端