负载均衡:节点负载差距这么大,为什么收到的流量还一样?

简介: 本文讲解RPC框架中的负载均衡机制,对比传统Web负载均衡,阐述其由调用端自主选择节点的优势。针对业务提出“智能调控流量”需求,提出自适应负载均衡方案:通过收集服务节点的CPU、内存、响应耗时等指标进行打分,动态调整节点权重,结合随机权重算法实现流量合理分配,提升系统稳定性和可用性。

上一讲我讲解了「多场景的路由选择」,其核心就是「如何根据不同的场景控制选择合适的目标机器」。今天我们来聊一个新的话题,看看在 RPC 中如何实现负载均衡。
一个需求
在进入主题之前,我想先和你分享一个需求,这是我们公司的业务部门给我们提的。
他们反馈的问题是这样的:有一次碰上流量高峰,他们突然发现线上服务的可用率降低了,经过排查发现,是因为其中有几台机器比较旧了。当时最早申请的一批容器配置比较低,缩容的时候留下了几台,当流量达到高峰时,这几台容器由于负载太高,就扛不住压力了。业务问我们有没有好的服务治理策略?
服务节点(配置较低的容器)负载过高服务节点服务调用者服务节点

这个问题其实挺好解决的,我们当时给出的方案是:在治理平台上调低这几台机器的权重,这样的话,访问的流量自然就减少了。
但业务接着反馈了,说:当他们发现服务可用率降低的时候,业务请求已经受到影响了,这时再如此解决,需要时间啊,那这段时间里业务可能已经有损失了。紧接着他们就提出了需求,问:RPC 框架有没有什么智能负载的机制?能否及时地自动控制服务节点接收到的访问量?
这个需求其实很合理,这也是一个比较普遍的问题。确实,虽说我们的服务治理平台能够动态地控制线上服务节点接收的访问量,但当业务方发现部分机器负载过高或者响应变慢的时候再去调整节点权重,真的很可能已经影响到线上服务的可用率了(人工干预的时效性较低差。
看到这儿,你有没有想到什么好的处理方案呢?接下来,我们就以这个问题为背景,一起看看 RPC 框架的负载均衡。
什么是负载均衡?
我先来简单地介绍下负载均衡。当我们的一个服务节点无法支撑现有的访问量时,我们会部署多个节点,组成一个集群,然后通过负载均衡,将请求分发给这个集群下的每个服务节点,从而达到多个服务节点共同分担请求压力的目的。
服务节点服务节点负载均衡域名请求服务节点服务节点

负载均衡主要分为软负载和硬负载,软负载就是在一台或多台服务器上安装负载均衡的软件,如 LVS、Nginx 等,硬负载就是通过硬件设备来实现的负载均衡,如 F5 服务器等。负载均衡的算法主要有随机法、轮询法、最小连接法等。
我刚才介绍的负载均衡主要还是应用在 Web 服务上,Web 服务的域名绑定负载均衡的地址,通过负载均衡将用户的请求分发到一个个后端服务上。
RPC 框架中的负载均衡
那 RPC 框架中的负载均衡是不是也是如此呢?和我上面讲的负载均衡,你觉得会有区别吗?
我们可以回想下 第 08 讲 的开头:我讲到为什么不通过 DNS 来实现「服务发现」,之后我又讲解了为什么不采用添加负载均衡设备或者 TCP/IP 四层代理,域名绑定负载均衡设备的 IP 或者四层代理 IP 的方式。
我的回答是这种方式会面临这样几个问题:
1
搭建负载均衡设备或 TCP/IP 四层代理,需要额外成本;
2
请求流量都经过负载均衡设备,多经过一次网络传输,会额外浪费一些性能;
3
负载均衡添加节点和摘除节点,一般都要手动添加,当大批量扩容和下线时,会有大量的人工操作,“服务发现”在操作上是个问题;
4
我们在服务治理的时候,针对不同接口服务、服务的不同分组,我们的负载均衡策略是需要可配的,如果大家都经过这一个负载均衡设备,就不容易根据不同的场景来配置不同的负载均衡策略了。
我相信看到这儿,你应该已经知道了 RPC 实现的负载均衡所采用的策略与传统的 Web 服务实现负载均衡所采用策略的不同之处了。
RPC 的负载均衡完全由 RPC 框架自身实现,RPC 的服务调用者会与「注册中心」下发的所有服务节点建立长连接,在每次发起 RPC 调用时,服务调用者都会通过配置的负载均衡插件,自主选择一个服务节点,发起 RPC 调用请求。
服务集群服务调用者负载均衡插件选择一个服务节点服务节点发送请求消息发起请求集群管理器服务节点动态代理服务节点

RPC 负载均衡策略一般包括随机权重、Hash、轮询。当然,这还是主要看 RPC 框架自身的实现。其中的随机权重策略应该是我们最常用的一种了,通过随机算法,我们基本可以保证每个节点接收到的请求流量是均匀的;同时我们还可以通过控制节点权重的方式,来进行流量控制。比如我们默认每个节点的权重都是 100,但当我们把其中的一个节点的权重设置成 50 时,它接收到的流量就是其他节点的 1/2。
这几种负载均衡算法的实现还是很简单的,网上资料也非常多,在这我就不过多介绍了。
由于负载均衡机制完全是由 RPC 框架自身实现的,所以它不再需要依赖任何负载均衡设备,自然也不会发生负载均衡设备的单点问题,服务调用方的负载均衡策略也完全可配,同时我们可以通过控制权重的方式,对负载均衡进行治理。
了解完 RPC 框架的负载均衡,现在我们就可以回到这讲最开头业务提的那个需求:有没有什么办法可以动态地、智能地控制线上服务节点所接收到的请求流量?
现在答案是不是就显而易见了,解决问题的关键就在于 RPC 框架的负载均衡上。对于这个问题,我们当时的方案就是,设计一种自适应的负载均衡策略。
如何设计自适应的负载均衡?
我刚才讲过,RPC 的负载均衡完全由 RPC 框架自身实现,服务调用者发起请求时,会通过配置的负载均衡插件,自主地选择服务节点。那是不是只要调用者知道每个服务节点处理请求的能力,再根据服务处理节点处理请求的能力来判断要打给它多少流量就可以了?当一个服务节点负载过高或响应过慢时,就少给它发送请求,反之则多给它发送请求。
这就有点像日常工作中的分配任务,要多考虑实际情况。当一位下属身体欠佳,就少给他些工作;若刚好另一位下属状态很好,手头工作又不是很多,就多分给他一点。
那服务调用者节点又该如何判定一个服务节点的处理能力呢?
这里我们可以采用一种打分的策略,服务调用者收集与之建立长连接的每个服务节点的指标数据,如服务节点的负载指标、CPU 核数、内存大小、请求处理的耗时指标(如请求平均耗时、TP99、TP999)、服务节点的状态指标(如正常、亚健康)。通过这些指标,计算出一个分数,比如总分 10 分,如果 CPU 负载达到 70%,就减它 3 分,当然了,减 3 分只是个类比,需要减多少分是需要一个计算策略的。
我们又该如果根据这些指标来打分呢?
这就有点像公司对员工进行年终考核。假设我是老板,我要考核专业能力、沟通能力和工作态度,这三项的占比分别是 30%、30%、40%,我给一个员工的评分是 10、8、8,那他的综合分数就是这样计算的:1030%+830%+840%=8.6 分。
给服务节点打分也一样,我们可以为每个指标都设置一个指标权重占比,然后再根据这些指标数据,计算分数。
服务调用者给每个服务节点都打完分之后,会发送请求,那这时候我们又该如何根据分数去控制给每个服务节点发送多少流量呢?
我们可以配合随机权重的负载均衡策略去控制,通过最终的指标分数修改服务节点最终的权重。例如给一个服务节点综合打分是 8 分(满分 10 分),服务节点的权重是 100,那么计算后最终权重就是 80(100
80%)。服务调用者发送请求时,会通过随机权重的策略来选择服务节点,那么这个节点接收到的流量就是其他正常节点的 80%(这里假设其他节点默认权重都是 100,且指标正常,打分为 10 分的情况)。
到这儿,一个自适应的负载均衡我们就完成了,整体的设计方案如下图所示:
服务集群服务调用者服务节点发送请求消息发起请求集群管理器服务节点动态代理服务节点选择一个服务节点自适应负载均衡器随机权重策略打分器权重计算器指标收集器

关键步骤我来解释下:
1
添加服务指标收集器,并将其作为插件,默认有运行时状态指标收集器、请求耗时指标收集器。
2
运行时状态指标收集器收集服务节点 CPU 核数、CPU 负载以及内存等指标,在服务调用者与服务提供者的心跳数据中获取。
3
请求耗时指标收集器收集请求耗时数据,如平均耗时、TP99、TP999 等。
4
可以配置开启哪些指标收集器,并设置这些参考指标的指标权重,再根据指标数据和指标权重来综合打分。
5
通过服务节点的综合打分与节点的权重,最终计算出节点的最终权重,之后服务调用者会根据随机权重的策略,来选择服务节点。
总结
今天我们详细讲解了 RPC 框架的负载均衡,它与 Web 服务的负载均衡的不同之处在于:RPC 框架并不是依赖一个负载均衡设备或者负载均衡服务器来实现负载均衡的,而是由 RPC 框架本身实现的,服务调用者可以自主选择服务节点,发起服务调用。
这样的好处是,RPC 框架不再需要依赖专门的负载均衡设备,可以节约成本;还减少了与负载均衡设备间额外的网络传输,提升了传输效率;并且均衡策略可配,便于服务治理。
除此之外,我们今天的重点还涉及到「如何设计一个自适应的负载均衡」,通过它,我们可以就能根据服务调用者依赖的服务集群中每个节点的自身状态,智能地控制发送给每个服务节点的请求流量,防止因某个服务节点负载过高、请求处理过慢而影响到整个服务集群的可用率。
这个自适应负载均衡的实现方案,其实不只是应用于 RPC 框架中的负载均衡,它本身便是一个智能负载的解决方案,如果你在工作中需要设计一个智能的负载均衡服务,那么完全可以参考。
课后思考
你知道 RPC 框架中还有哪些负载均衡策略吗?它们的优缺点是什么?
若有收获,就点个赞吧

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
20小时前
|
存储 算法 搜索推荐
java人事面试题
本课程采用“三步走”策略高效学习检索技术:先夯实数据结构与算法基础,再通过实际场景如搜索引擎、推荐系统等实践落地,最后结合理解记忆、知识体系构建与反复交流,实现从理论到应用的全面掌握。
|
16小时前
|
存储 算法 搜索推荐
特别加餐 | 倒排检索加速(一):工业界如何利用跳表、哈希表、位图进行加速?
本文深入解析工业界倒排索引的优化技术,介绍跳表、哈希表和位图如何加速posting list求交集。结合相互二分查找、Roaring Bitmap等方案,展现基础数据结构在实际系统中的高效融合与应用。
|
16小时前
|
机器学习/深度学习 搜索推荐 算法
推荐引擎:没有搜索词,「头条」怎么找到你感兴趣的文章?
资讯类App通过“下拉刷新”精准推荐内容,背后依赖推荐引擎的检索技术。它基于用户行为数据构建用户画像与文章画像,结合协同过滤、内容召回等算法,实现个性化推荐,并通过多路召回与分层排序提升效率与准确性。
|
16小时前
|
存储 固态存储 关系型数据库
特别加餐 | 高性能检索系统中的设计漫谈
本文系统梳理了高性能检索系统中的四大核心设计思想:索引与数据分离、减少磁盘IO、读写分离和分层处理。通过典型案例对比与深入分析,揭示其本质原理与通用优化经验,帮助开发者在实际场景中合理应用,提升系统性能与可维护性。(238字)
|
17小时前
|
Docker 容器
Dockerfile
Dockerfile是构建Docker镜像的脚本文件,包含一系列指令,每条指令创建一个镜像层。编写时需用大写指令、按序执行,#为注释。通过docker build构建镜像,再用docker run运行容器。构建时,Docker引擎逐条执行指令,提交每一层变更,最终生成新镜像。
|
17小时前
|
存储 自然语言处理 搜索推荐
索引更新:刚发布的文章就能被搜到,这是怎么做到的?
本文介绍工业级倒排索引的高效更新机制。针对小规模内存索引,采用Double Buffer实现无锁读写;对于大规模索引,则使用“全量+增量”索引方案,结合删除列表处理删改操作,并通过完全重建、再合并或滚动合并策略管理增量数据增长,提升系统性能与稳定性。
|
17小时前
|
机器学习/深度学习 搜索推荐 算法
广告系统:广告引擎如何做到在 0.1s 内返回广告信息?
广告系统是互联网公司核心营收支柱,如Google、Facebook超80%收入来自广告。其背后依赖高性能广告引擎,实现高并发、低延迟的精准投放。本文深入解析广告引擎架构,涵盖标签检索、向量匹配、打分排序与索引优化四大关键技术,揭示如何在0.1秒内完成从请求到返回的全流程,支撑千人千面的智能广告体验。
|
17小时前
|
存储 索引
空间检索(下):「查找最近的加油站」和「查找附近的人」有何不同?
本文回顾了利用四叉树在二维空间高效检索最近k个元素的方法,适用于动态查询场景。通过递归划分空间,四叉树可快速定位目标区域,避免满四叉树的空间浪费,常用非满四叉树优化存储。类似思想也适用于GeoHash编码的前缀树索引,提升检索效率。(239字)
|
18小时前
|
SQL Dubbo Java
线程池:故障梳理总结
本文从故障与技术双重视角,总结线程池满导致服务不可用的常见原因及应对策略。涵盖数据库慢查询、连接池配置不当、自定义线程池使用误区等典型问题,结合真实案例分析,提出fast-fail、流控、背压、谨慎重试等最佳实践,助力开发者提升系统稳定性。
|
17小时前
|
存储 算法 安全
基础算法
加密算法主要分为对称加密(如AES、SM4)、非对称加密(如RSA、SM2)、哈希摘要(如SHA-2、SM3)、电子签名和密码存储。对称加密加解密快但需保密密钥;非对称加密使用公私钥,安全性高但速度慢;哈希摘要用于验证数据完整性,具备唯一性特征,广泛应用于安全认证与数据校验场景。