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
Dubbo -- 四种loadBalance负载均衡算法的更多相关文章
- IPVS和Nginx两种WRR负载均衡算法详解
动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了! ...
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- Dubbo的负载均衡算法源码分析
Dubbo提供了四种负载均衡:RandomLoadBalance,RoundRobinLoadBalance,LeastActiveLoadBalance,ConsistentHashLoadBala ...
- 几种简单的负载均衡算法及其Java代码实现
什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技 ...
- Nginx几种负载均衡算法及配置实例
本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...
- Ribbon提供的负载均衡算法IRule(四)
一.Ribbon算法的介绍 Ribbon的源码地址:https://github.com/Netflix/ribbon IRule:根据特定算法中从服务器列表中选取一个要访问的服务,Ribbon默认的 ...
- 负载均衡算法(四)IP Hash负载均衡算法
/// <summary> /// IP Hash负载均衡算法 /// </summary> public static class IpHash { static Dicti ...
- Dubbo加权轮询负载均衡的源码和Bug,了解一下?
本文是对于Dubbo负载均衡策略之一的加权随机算法的详细分析.从2.6.4版本聊起,该版本在某些情况下存在着比较严重的性能问题.由问题入手,层层深入,了解该算法在Dubbo中的演变过程,读懂它的前世今 ...
- Dubbo一致性哈希负载均衡的源码和Bug,了解一下?
本文是对于Dubbo负载均衡策略之一的一致性哈希负载均衡的详细分析.对源码逐行解读.根据实际运行结果,配以丰富的图片,可能是东半球讲一致性哈希算法在Dubbo中的实现最详细的文章了. 文中所示源码,没 ...
随机推荐
- 273道题目;更新到java题目里面 (已迁移到其他类目下面,存储)
1. Java 基础 1.JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗? ...
- var a = function(){}和var a = function(){}();的区别
var a = function(){ ... ... ... } 声明方法. var a = function(){ ... ... ... }(); 声明方法并执行 demo: var u = f ...
- 刷题记录:Shrine
目录 刷题记录:Shrine 刷题记录:Shrine 题目复现链接:https://buuoj.cn/challenges 参考链接:Shrine 解此题总结一下flask的SSTI:CTF SSTI ...
- Java自己实现HTTP服务器来理解GET和POST区别
GET请求和POST请求有什么区别?GET请求的参数在URL的问号后面显示,而POST参数不在URL上:POST可以比GET请求更大的数据…一般的回答都是这样. 但是作为一个高端大气上档次的程序员 ...
- SpringBoot dev-tools vjtools dozer热启动类加载器不相同问题
最近使用唯品会的vjtools的BeanMapper进行对象的深度克隆转换DTO/VO这种操作,Spring Boot的dev-tools热启动,需要把vjtools和dozer包都放到spring- ...
- spring @Transactional 事务注解的坑
1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和接口方法.类定义和类的 public 方法上. 2. @Transactiona ...
- ubuntu16.04 安装使用meld及问题
本文链接:https://blog.csdn.net/ai_liuliu/article/details/95504095安装meldsudo apt-get install meld启动meld方法 ...
- pandas filter数据筛选
https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&shareId=400000000398 ...
- [转]eclipse中explorer显示方式
原文地址:https://www.cnblogs.com/gne-hwz/p/7590451.html 不知道是不是上面的描述.做个记录 project explorer 项目资源管理器 这个要打开代 ...
- 如何下载官网最新版 win10 系统?
如何下载官网最新版 win10 系统?步骤: 一. 下载 遨游浏览器 将UA切换成,手机访问:推荐 UC浏览器,UA设置: Mozilla/5.0 (Linux; U; Android 8.0.0; ...