2万字长文带你细细盘点五种负载均衡策略

Dubbo的五种负载均衡策略2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本 。其中有这么一个 Features

2万字长文带你细细盘点五种负载均衡策略

文章插图
 
新增一个负载均衡策略 。
熟悉我的老读者肯定是知道的,Dubbo 的负载均衡我都写过专门的文章,对每个负载均衡算法进行了源码的解读,还分享了自己调试过程中的一些骚操作 。
新的负载均衡出来了,那必须的得解读一波 。
先看一下提交记录:
https://github.com/chickenlj/incubator-dubbo/commit/6d2ba7ec7b5a1cb7971143d4262d0a1bfc826d45

2万字长文带你细细盘点五种负载均衡策略

文章插图
 
负载均衡是基于 SPI 实现的,我们看到对应的文件中多了一个名为 shortestresponse 的 key 。
这个,就是新增的负载均衡策略了 。看名字,你也知道了这个策略的名称就叫:最短响应 。
所以截止 2.7.7 版本,官方提供了五种负载均衡算法了,他们分别是:
  1. ConsistentHashLoadBalance 一致性哈希负载均衡
  2. LeastActiveLoadBalance 最小活跃数负载均衡
  3. RandomLoadBalance 加权随机负载均衡
  4. RoundRobinLoadBalance 加权轮询负载均衡
  5. ShortestResponseLoadBalance 最短响应时间负载均衡
前面四种我已经在之前的文章中进行了详细的分析 。有的读者反馈说想看合辑,所以我会在这篇文章中把之前文章也整合进来 。
所以,需要特别强调一下的是,这篇文章集合了之前写的三篇负载均衡的文章 。看完最短响应时间负载均衡这一部分后,如果你看过我之前的那三篇文章,你可以温故而知新,也可以直接拉到文末看看我推荐的一个活动,然后点个赞再走 。如果你没有看过那三篇,这篇文章如果你细看,肯定有很多收获,以后谈起负载均衡的时候若数家珍,但是肯定需要看非常非常长的时间,做好心理准备 。
我已经预感到了,这篇文章妥妥的会超过 2 万字 。属于硬核劝退文章,想想就害怕 。
最短响应时间负载均衡首先,我们看一下这个类上的注解,先有个整体的认知 。
org.Apache.dubbo.rpc.cluster.loadbalance.ShortestResponseLoadBalance
2万字长文带你细细盘点五种负载均衡策略

文章插图
 
我来翻译一下是什么意思:
  1. 从多个服务提供者中选择出调用成功的且响应时间最短的服务提供者,由于满足这样条件的服务提供者有可能有多个 。所以当选择出多个服务提供者后要根据他们的权重做分析 。
  2. 但是如果只选择出来了一个,直接用选出来这个 。
  3. 如果真的有多个,看它们的权重是否一样,如果不一样,则走加权随机算法的逻辑 。
  4. 如果它们的权重是一样的,则随机调用一个 。
再配个图,就好理解了,可以先不管图片中的标号:
2万字长文带你细细盘点五种负载均衡策略

文章插图
 
有了上面的整体概念的铺垫了,接下来分析源码的时候就简单了 。
源码一共就 66 行,我把它分为 5 个片段去一一分析 。
2万字长文带你细细盘点五种负载均衡策略

文章插图
 
这里一到五的标号,对应上面流程图中的标号 。我们一个个的说 。
标号为①的部分
2万字长文带你细细盘点五种负载均衡策略

文章插图
 
这一部分是定义并初始化一些参数,为接下来的代码服务的,翻译一下每个参数对应的注释:
length 参数:服务提供者的数量 。
shortestResponse 参数:所有服务提供者的估计最短响应时间 。(这个地方我觉得注释描述的不太准确,看后面的代码可以知道这只是一个零时变量,在循环中存储当前最短响应时间是多少 。)
shortCount 参数:具有相同最短响应时间的服务提供者个数,初始化为 0 。
shortestIndexes 参数:数组里面放的是具有相同最短响应时间的服务提供者的下标 。
weights 参数:每一个服务提供者的权重 。
totalWeight 参数:多个具有相同最短响应时间的服务提供者对应的预热(预热这个点还是挺重要的,在下面讲最小活跃数负载均衡的时候有详细说明)权重之和 。
firstWeight 参数:第一个具有最短响应时间的服务提供者的权重 。
sameWeight 参数:多个满足条件的提供者的权重是否一致 。
标号为②的部分
2万字长文带你细细盘点五种负载均衡策略


推荐阅读