zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    js插件-图片椭圆轮播效果
    js-放大镜效果
    vue使用技巧,及遇到的问题
    vue的传参方式和router使用技巧
    关于new Date()的日期格式处理
    图片上传预览
    缓动动画的原理
    input不能输入汉字和负数
    上传格式判断方法
    Vue-cli3.0配置全局less
  • 原文地址:https://www.cnblogs.com/yust/p/11316054.html
Copyright © 2011-2022 走看看