Dubbo -- 四种loadBalance负载均衡算法

  Dubbo中的一个关键接口LoadBalance,dubbo是按照其中的规则来调用多台provider的服务的。

  先看一下接口的实现类图:

  

  从上图中我们可以看到dubbo提供了四种算法来实现负载均衡。

  1.RandomLoadBalance:随机,按权重设置随机概率。

  从字面意思也很好理解,根据每个invoker提前设置好的权重随机分配,看一下源码的实现:    

  可以看出其实现逻辑是如果所有的invoker的权重都一样,则随机给出一个invoker,

  否则按照权重进行分配,按照权重进行分配相信大家都有接触过,但是dubbo的这种实现方式还是很优雅,很值得学习和借鉴的,就是我上图中标记出的部分,

  可以看到dubbo是将所有的invoker的权重都加起来,在这个总权重范围内随机生成一个数字,用这个数字依次减去没个invoker的权重,当值变为<时,即是这个invoker来执行。

  例如,有四个invoker,权重分别是:1,2,3,4,总权重为10,随机生成数字为5,则5-1=4,4-2=2,2-3=-1<0,即可判定是权重为3的invoker来执行,

  按照这个逻辑:

  权重为1的会执行的随机数:0.

  权重为2的会执行的随机数:1~2.

  权重为3的会执行的随机数:3,4,5.

  权重为4的会执行的随机数:6,7,8,9.

  2.ConsistentHashLoadBalance:一致性哈希算法

  相同参数的请求总是发到同一提供者。

  

  但是缺省只对第一个参数进行hash,请注意这些默认参数:

  

   3.LeastActiveLoadBalance:最小活跃数负载均衡

  最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

  使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

  这里牵扯到一个问题,如何统计活跃数呢?我们来看源码实现:

  

  每次调用该invoker时会将数字+1,调用完成后-1,这样执行慢的invoker在同一时间节点上的活跃数字就会比较大,快的就会比较小

  当只有一个最小活跃数的invoker时直接返回该invoker

  当多个invoker活跃数一致但权重不一致时就根据上文的随机权重算法进选择

  当多个invoker活跃数一致权重也一致时,就从中随机进行返回。

  4.RoundRobinLoadBalance:根据权重进轮训,轮训的缺点就是无法顾及invoker的执行效率,有可能将请求积压在某一处理较慢的provider上。

  参考大神文章:https://www.jianshu.com/p/53feb7f5f5d9

  

原文地址:https://www.cnblogs.com/yust/p/11316054.html