手把手教你写出 6 种负载均衡算法!

Posted 业余草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手教你写出 6 种负载均衡算法!相关的知识,希望对你有一定的参考价值。

第一时间获取技术干货和业界资讯!


常见的负载均衡算法,大概有 7 种。它们分别是:完全随机算法、加权随机算法、完全轮询算法、加权轮询算法、平滑加权轮询算法、哈希算法、最小压力算法。本文结合我个人的理解,给大家从头来写出 6 种负载均衡算法。

负载均衡算法,虽然你平时可能用不到,但是面试中可能会被问到。比如,面试 Dubbo,就可能问问你了解不了解 Dubbo 的负载均衡算法。还有 nginx 等,这些都和并发编程存在着一些关联。了解它们,能让我们避免很多坑。

手把手教你写出 6 种负载均衡算法!

下面先看第一种,完全随机算法。随机就是没有规律的,随便从负载中获得一台,通常我相信大家第一时间会想到随机数。完全随机算法就和随机数有些关系。看下面的实现代码:

手把手教你写出 6 种负载均衡算法!

代码非常的简单,我就不在详细的解释。下面再看加权随机算法。

随机算法有一个缺点就是,所有的服务器被访问到的概率都是相同的。如果我某台服务器性能比较好,需要随机的权重高一些,那该怎么办?加权随机算法就是解决这个问题的。代码如下:

手把手教你写出 6 种负载均衡算法!

这个算法,虽然解决了权重问题。但是,在我的权重设置过大的时候,比如上万,上千万。那么你的 List 就会被撑爆。所以,还有另外一种写法。代码如下:

手把手教你写出 6 种负载均衡算法!

  • 如果我生成的随机数是 1,那么落到 www.xttblog.com 服务器,因为 1<=2(www.xttblog.com 服务器的权重)

随机算法有一个缺点就是,有时候有些机器可能很长一段时间都随机不到。所以,就又有了轮询算法。

完全轮询算法,非常的简单,从头到尾,到尾了后,再从头开始。代码如下:

手把手教你写出 6 种负载均衡算法!

但这里还涉及到一个权重问题。因此就又有了加权轮询算法。代码如下:

手把手教你写出 6 种负载均衡算法!

加权轮询,看起来并没什么问题,但是在实际中,可能某个服务器权重大,长时间执行。遇到耗时大的请求,压力非常的大。存在着不合理性。因此就诞生了一种叫平滑加权轮询算法。

代码稍微多一点,先看一个权重类。

手把手教你写出 6 种负载均衡算法!

核心代码如下:

手把手教你写出 6 种负载均衡算法!

算法的原理是:每个服务器都有两个权重变量。weight,配置文件中指定的该服务器的权重,这个值是固定不变的;current_weight,服务器目前的权重。一开始为 0,之后会动态调整。每次当请求到来,选取服务器时,会遍历数组中所有服务器。对于每个服务器,让它的 current_weight 增加它的 weight;同时累加所有服务器的 weight,并保存为 total。遍历完所有服务器之后,如果该服务器的 current_weight 是最大的,就选择这个服务器处理本次请求。最后把该服务器的 current_weight 减去 total。

上面的算法虽好,但是在集群环境下,我想让同一个用户的访问,分流到固定的一台机器上,怎么办?所以就又有了哈希负载均衡算法。

手把手教你写出 6 种负载均衡算法!


上面的 6 种负载均衡算法是非常常见的,很可能在面试中被问到。我这里只是实现,实际应用中还要结合各种设计模式。另外可能把几种算法组合起来用。


本文摘录自我的知识星球。让本该造火箭的你,不再拧螺丝!


手把手教你写出 6 种负载均衡算法!


 你再主动一点点   我们就有故事了

以上是关于手把手教你写出 6 种负载均衡算法!的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你AspNetCore WebApi:Nginx(负载均衡)

手把手教你 SpringBoot+SpringCloud —— Ribbon负载均衡与配置

6种负载均衡算法

浅析负载均衡的6种算法,Ngnix的5种算法。

6种负载均衡算法-转载

华为云服务-运维篇-负载均衡介绍与平台算法使用