主要介绍:分布式经典理论相关面试题。涉及领域:CAP基础理论、分布式事务、分布式ID、负载均衡、系统并发能力、微服务划分、限流算法等

1、什么是CAP、Base理论?

CAP定理,指的是在一个分布式系统中,最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。(三选二)

C:一致性(Consistency),数据在多个副本中保持一致,可以理解成两个用户访问两个系统A和B,当A系统数据有变化时,及时同步给B系统,让两个用户看到的数据是一致的。

A:可用性(Availabiity),系统对外提供服务必须一直处于可用状态,在任何故障下,客户端都能在合理时间内获得服务端非错误的响应。

P:分区容错性\(Partition tolerance),在分布式系统中遇到任何网络分区故障,系统仍然能对外提供服务网络分区,可以这样理解,在分布式系统中,不同的节点分布在不同的子网络中,有可能子网络中只有一个节点,在所有网络正常的情况下,由于某些原因导致这些子节点之间的网络出现故障,导致整个节点环境被切分成了不同的独立区域,这就是网络分区。

如图所示。

图片

注意点:

1、网络分区

2、CP和AP智能满足其一

3、注册中心Eureka是AP,Zookeeper是CP

2、谈谈你对分布式事务的理解?

附加:

  • 什么是两阶段提交、三阶段提交?

  • 什么是补偿性事务?

  • 如何使用消息队列和事件表实现分布式事务?

  • RocketMQ在分布式事务中的应用?

参考:《如何选择分布式事务解决方案?

3、分布式幂等性如何设计?

常见的解决方案,参考:《幂等设计的8种实现方式

4、分布式ID生成有哪些方案?

常用的有以下几种:

图片

关于各种分布式ID实现原理,

详细参考(引用):《8种分布式ID生成方案汇总

5、如何处理数据库中大数据量?

对数据库进行:分区、分库分表,主从架构(读写分离)

1. 分区: 数据隔离

图片

2. 分库分表

  • 水平分库/表,各个库和表的结构一模一样。

  • 垂直分库/表,各个库和表的结构不一样。

图片

图片来源于网络

关于分库分表相关,可参考:

分库分表设计及常见问题

分库分表实战-Sharding-JDBC

3. 读写分离

主机负责写,从机负责读。

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

6、常见的负载均衡算法有哪些?

1. 轮询负载均衡算法

RR ,Round Robin,如果有两个服务器,你一下,我一下。

2. 加权轮询算法

weighted round robin ,wrr,按照权重不同来分发,基本上是基于配置。

比如:两个服务权重分别是6和4,我们的方法,在1-10之间取 随机数,比如取到 1-6,就走6的权重,取到710,就走4权重的服务。

3. 随机轮询算法

Random

最少链接:Least connections,记录每个服务器正在处理的 连接数(请求数),将新的请求分发到最少连接的服务器上,这是最符合负载均衡的算法。

如:放到redis里,做hash,可以用:incr。

7、熔断和降级的区别?

1. 相同点

  • 都是从高可用着想,为防止系统的整体响应缓慢甚至崩溃,而采用的技术手段。最终让用户体验到的是某些功能暂时不可达或不可用。

  • 都是服务级别的。

  • 自治性很高 : 熔断一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,预置开关、配置中心都是必要手段。

2. 区别

  • 服务熔断一般是某个服务(下游服务)故障引起;服务降级一般是从整体负荷考虑。

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

  • 熔断时一个框架级的处理,每个服务都需要;降级一般在服务调用的上层处理。

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

使用时,根据业务情况在服务层面处理。

8、如何进行服务划分?

依据系统业务的边界划分。

一般按功能域拆分。如:

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

9、如何提高系统并发能力?

文章引用自:《如何设计一个高并发系统?

10、了解那些常用的限流算法,说说原理?

  • 滑动时间窗口算法

滑动时间窗口算(也叫计数器算法),是指在指定的时间周期内,累加访问的次数,达到设定的值时,触发限流策略。下一个时间周期进行访问时,访问次数清零。计算器算法如图所示。

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

从上图看出,

  • 设置一分钟的阈值是100,在0:00到1:00内请求数是60,

  • 当到1:00时,请求数清零,从0开始计算这时在1:00到2:00之间能处理的最大的请求为100,超过100个的请求,系统都拒绝。

  • 存在临界问题,图中,在0:00到1:00内,只在0:50有60个请求,而在1:00到2:00之间,只在1:10有60个请求,虽然在两个一分钟的时间内,都没有超过100个请求,但是在0:50到1:10这20秒内,确有120个请求,虽然在每个周期内,都没超过阈值,但是在这20秒内,已经远远超过了原来设置的1分钟内100个请求的阈值。

  • 漏桶算法

漏桶算法的原理就像它的名字一样,维持一个漏斗,它有恒定的流出速度,不管水流流入的速度有多快,漏斗出水的速度始终保持不变,类似于消息中间件,不管消息的生产者请求量有多大,消息的处理能力取决于消费者。

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

在漏桶限流算法中,存在下面几种情况:

(1)当请求速度大于漏桶的流出速度时,也就是请求量大于当前服务所能处理的最大极限值时,触发限流策略。

(2)请求速度小于或等于漏桶的流出速度时,也就是服务的处理能力大于或等于请求量时,正常执行。

漏桶算法有一个缺点,当系统在短时间内有突发的大流量时,桶算法处理不了。

  • 令牌桶算法

1、令牌桶算法,指系统以恒定的速率向令牌桶中放入令牌,如果有客户端来请求,先需要从令牌桶中拿一个令牌,拿到令牌,才有资格访问系统,这时令牌桶中少一个令牌。当令牌桶满的时候,再向令牌桶生成令牌时,令牌会被抛弃。

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

2、在令牌桶算法中,存在以下几种情况。

(1)请求速度大于令牌的生成速度:那么令牌桶中的令牌会被取完,后续再进来的请求,由于拿不到令牌,会被限流。

(2)请求速度等于令牌的生成速度:那么此时系统处于平稳状态,

(3)请求速度小于令牌的生成速度:那么此时系统的访问量远远低于系统的并发能力,请求可以被正常处理。

令牌桶算法,可以处理短时间大流量的场景。

往期推荐(高频面试系列)

面试高频-10道经典Redis面试题

面试高频-10道经典的JVM面试题

面试高频-20道经典MySQL面试题

面试高频-10道经典的线程池面试题

面试高频-10道经典的Spring面试题

面试高频-10道经典的Java并发编程题

文章来源,依近期学习笔记整理。

结尾

  _共享即共赢_。如有帮助,欢迎转发点赞在看。关注公众号【码易有道】,一起做长期且正确的事情!!!

![图片](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’http://www.w3.org/2000/svg‘ xmlns:xlink=’http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

本文转自 https://mp.weixin.qq.com/s/BaeiJuVM6wiz9W3Wq_AvDA,如有侵权,请联系删除。