面试高频——10 道经典分布式面试题
主要介绍:分布式经典理论相关面试题。涉及领域: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. 分库分表
水平分库/表,各个库和表的结构一模一样。
垂直分库/表,各个库和表的结构不一样。
图片来源于网络
关于分库分表相关,可参考:
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)请求速度小于令牌的生成速度:那么此时系统的访问量远远低于系统的并发能力,请求可以被正常处理。
令牌桶算法,可以处理短时间大流量
的场景。
往期推荐(高频面试系列)
文章来源,依近期学习笔记整理。
结尾
_共享即共赢_。如有帮助,欢迎转发
、点赞
和在看
。关注公众号【码易有道】,一起做长期且正确的事情!!!
![图片](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,如有侵权,请联系删除。