后端工程师的高阶面经
邓明
前 Shopee 高级工程师,Beego PMC
6888 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
后端工程师的高阶面经
15
15
1.0x
00:00/00:00
登录|注册

02|负载均衡:调用结果、缓存机制是怎么影响负载均衡的?

你好,我是大明。今天我们来聊一聊微服务架构下的负载均衡。
负载均衡在微服务架构里也处于一个核心位置。一般我们在准备调用任何服务的时候,第一个要解决的问题就是负载均衡该怎么做。负载均衡在微服务架构的面试中,也属于必面题目。
可惜的是,即便我们都知道负载均衡在面试中是必考点,但是在每一次面试的时候都还是难以刷出亮点。大多数的回答都仅仅是简单罗列一下负载均衡的算法,稍微有些亮点的则是讨论一下不同算法的优缺点。但是这并不能让你在面试官心里留下深刻印象。
所以今天我就来给你介绍一下负载均衡算法里面一些可以用于面试的微妙细节,同时给出一个本地缓存和负载均衡结合的案例,让你在面试的时候刷出亮点。下面我先来给你介绍微服务架构里面常见的负载均衡算法,让你先有一个最基本的理解。

前置知识

负载均衡,本质上就是回答一个问题:我该把请求发给哪个服务端?理论上来说,你会希望把请求发给某个能够最快返回响应的客户端。
这里你可能会觉得有些困惑,因为我们之前都听过轮询和加权轮询、随机和加权随机,哈希和一致性哈希这些负载均衡算法,但看上去它们并没有试图去判断哪个节点才是最合适的节点。
确实,这一类算法也叫做静态负载均衡算法。它们依靠的是统计学上的“最合适”。也就是说,如果请求都差不多,请求数量也足够多,那么它们能够挑选出比较合适的节点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了微服务架构下的负载均衡算法及其影响因素。首先介绍了负载均衡的基本概念,包括静态负载均衡算法和动态负载均衡算法。接着详细解释了常见的负载均衡算法,包括轮询与加权轮询、随机与加权随机、哈希与一致性哈希、最少连接数、最少活跃数以及最快响应时间。一致性哈希负载均衡算法被强调为面试热点,通过生动的比喻向读者解释了其工作原理。此外,文章还提到了各种算法的优缺点和适用场景,以及对应的改进算法。文章还提到了负载均衡算法的面试准备和亮点方案,包括对常见算法的记忆和理解、实际工作中的应用情况、以及根据业务设计独特的负载均衡算法。最后,文章介绍了负载均衡算法的面试思路总结和思考题。整体而言,本文系统地介绍了负载均衡算法的原理和实际应用,对于想要深入了解微服务架构下负载均衡的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端工程师的高阶面经》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • penbox
    1. 如果单纯从算法效果看,随机和轮询其实差不多。而现在据我观察,使用轮询要比使用随机多得多,你觉得这是为什么? 轮询算法和随机算法,从统计学角度来看,最终效果是一样的。但是轮询算法天然的就会比随机算法更平滑,可以避免连读多次请求打到一个节点上。 2. 在基本算法总结里面我用最少连接数算法举一个反面例子,但是同样的算法用在网关负载均衡上,就没有类似的问题,为什么? 客户端统计的连接数只是客户端自己与服务端之间的连接数,并不能代表服务端上所有的连接数,所以不具备参考性。而网关是服务端所有连接的入口,网关上统计的连接数实际上就是服务端的所有连接数,所以这个指标是有参考性的。

    作者回复: 赞!非常准确!

    2023-07-01归属地:四川
    2
    13
  • 程序员花卷
    为什么轮询比随机使用得多? 随机其实是不均衡的,可能会出现多次命中同一个服务端节点的情况,导致该服务端节点负载过高,严重的还有可能会产生服务雪崩。轮询可以将请求均衡的分发到每个服务端节点,一个个轮流着来,这样可以避免所有请求打到一个服务端节点的情况。但是轮询也有缺点,比如每个节点的处理能力可能并不一样,一个个轮流着命中的话,一些大请求也有可能会打到处理能力比较弱的节点上,显然不太合理。

    作者回复: 对的,随机的问题就是这个,尤其是特别倒霉的时候,你连续几次都命中同一个节点。当然,这也可以看做是可控性不强。 后面你对轮询的讨论也很对。一些简单的做法就是用权重来代表节点的处理能力,于是有了加权轮询。但是大请求的问题是非常难以解决,这也是不管选择什么负载均衡算法都有可能遇到偶发性的负载不均衡的根本原因。 之前我见过别人的骚操作,就是在负载均衡里面会检测一下是不是大请求。这个检测非常简单,就是每天计算一批大用户,然后负载均衡器会全量加载这些用户的 ID,在调用特定服务的时候,如果请求的用户 ID 就是这些大用户的 ID,就判定为大请求,而后发送到几台专门的机器上。 不过从本质上来说,它只是避开了大请求的问题,也没有根治。

    2023-06-22归属地:云南
    11
  • 雨落~紫竹
    我想到一个场景 对于大数据场景 数据都是从kafka来的 数据从kafka拉取后 要去获取一些其他数据 而对于一些热点数据 虽然放在redis 但是请求太频繁 网络成为瓶颈 所以放在本地缓存 但是过一段时间 可能导致所以机器 本地缓存的数据基本一致 可以根据对kafka消息进行一定维度的hash发送到指定分区 这样每台机器本地缓存 存的数据都不一样

    作者回复: 对的!这种根据哈希来选择对应分区的思路可以用于解决缓存、有序性。我之前还用过这个方式来优化过分布式锁。因为同一个业务的都分到了同一个分区上,所以只有一个消费者,也就不需要分布式锁了,差不多都是这个思路

    2023-06-26归属地:北京
    5
  • 特修斯之船
    没说到一致哈希的重点啊,这样一问就知道是半桶水,死记硬背。 普通哈希会面临一个问题,就是当增加或删除节点时,哈希值会重新落在不同的节点上,违背使用哈希算法的本意。 一致性的意思是保证当服务集群某个真实服务器出现故障,只影响该服务器的哈希,而不会导致整个服务集群的哈希键值重新分布。

    作者回复: 嘿嘿,我是觉得哈希的这个特性应该不需要我特意提,算是计算机非常基础的知识了,所以我并没有怎么说这个问题。后面我是觉得,哈希值均匀性和哈希环上节点的均匀性反而是比较少人讨论的,所以我提了一下。就好比随机,一个明显的缺点就是运气不太好的时候全部在一个节点上,这个也应该是比较容易想到的。

    2023-07-20归属地:广东
    2
    3
  • peter
    Q1:“客户端”并不是指终端,对吗? 本课中用到的“客户端”,我理解并不是通常意义上的网页或APP,而是相对于“服务端”的客户端;从后面的内容来看,也不是指Nginx或网关。那在微服务架构中,具体是指什么? Q2:哈希算法怎么保证均匀吗? 文中“所以要尽可能保证哈希值计算出来的结果是均匀的”,有什么具体方法来保证哈希的均匀性? Q3:99线是什么意思? 文中“可以是平均响应时间,也可以是 99 线之类的”,此处的99线是指什么? Q4:负载均衡有多种算法,对于一个公司来说,是确定用其中的某一种吗?或者是不同的子系统可能采用不同的算法?或者有多种算法,会根据情况动态选用其中的某一种? Q5:“响应+元数据”这种,消息是怎么发送的? 响应是给用户的,通常就是HTTP消息,元数据是内部用的,这两种怎么处理?定义一个内部消息,包含这两种,Nginx收到后取出元数据然后将响应发给用户吗? Q6:Nginx与网关重复吗? 用了Nginx,还会用网关吗?或者反过来,用了微服务网关,还需要用Nginx吗?网关数量一般很少吧,一般就两台作为主备,不能直接接收用户消息吗?网关外面还需要用Nginx吗?

    作者回复: 1. 这里要区分不同作用的网关。nginx是一种网关,还有一种微服务网关,比如说小伙伴搞的shenyu 就可以充当微服务网关,现在也叫做API网关,类似的还有APISIX之类的。 大公司网关会有多个,用于不同场景。正常来说nginx肯定会有,作为最外层的Web网关。

    2023-06-20归属地:北京
    6
    3
  • sheep
    平滑的加权轮询算法里面,这里的weight和currentWeight值都是多少呢,另外每一个节点的weight和currentWeight也应该会不一样吧

    作者回复: 初始的时候你随便设置一个就可以,运行过程中它们可能一样,可能不一样,说不准。

    2023-08-27归属地:广东
    2
  • Nordlicht
    将目标节点的 currrentWeight 修改为 currrentWeight= currrentWeight - sum(weight)。 这里减去sum(weight)会不会出现负数情况

    作者回复: 会,而且几乎一定会。就是因为出现负数之后,下一次你就肯定不会选中它

    2023-06-27归属地:江苏
    2
  • Geek_680632
    1.轮询相较于随机来说更加稳定,在最坏的情况下,随机可能导致一个节点分配到了大量请求;2.网关和应用服务所承载的职责不同,应用服务需要消耗大量资源,所以一定范围内的请求增长影响更大。

    作者回复: 2. 有道理。同时还是要考虑网关的一个特性,就是网关是知道所有服务端节点的情况的,所以它可以选出全局最优解。

    2023-10-11归属地:浙江
    1
  • 风清扬
    平滑的加权轮训算法,查阅了下,最早是在Nginx中出现,https://github.com/phusion/nginx/commit/27e94984486058d73157038f7950a0a36ecc6e35

    作者回复: 赞! 不过现在面试,单纯回答加权轮询,已经无法赢得竞争优势了。所以你要搞花活,就是各种 SAO 操作,调整权重。比如说超时了,我下调一点点;触发熔断、限流了,我唰一下调到很低。 这样面试就比较有亮点。

    2023-08-30归属地:广东
    1
  • 不吃辣👾
    为什么业界没有服务端上报自己状态给客户端的负载均衡算法呢? 感觉挺合理的。为什么呢

    作者回复: 因为用不上……就是这些花里胡哨的负载均衡算法在面试的时候很有价值,但是实践中很少应用。 大多数场景下,简单的轮询就足够了。 不过近两年有一些微服务框架允许在响应头里面带上一些元数据,这一类的负载均衡才开始多了起来。

    2023-08-13归属地:浙江
    2
    1
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)