dubbo系列之集群容错-loadbalance负载均衡
简要
从多个Invoker中选取一个做本次调用。具体包含很多种负载均衡算法。
源码构成
LoadBalance接口
1 |
|
**@SPI(RandomLoadBalance.NAME)**代表默认是随机算法。
算法的设置是在provider的dubbo.properties文件中
1 | dubbo.service.loadbalance=roundrobin |
若不设置则就是默认的随机算法
看一下继承体系图
RandomLoadBalance:随机(默认),按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobinLoadBalance:轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上(解决办法就是将这台机器的权重设置低一点)。
LeastActiveLoadBalance:最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHashLoadBalance:一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
本篇博客重点还是讲RandomLoadBalance和RoundRobinLoadBalance
RoundRobinLoadBalance类
1 | public class RoundRobinLoadBalance extends AbstractLoadBalance { |
因为我们跑demo的时候一直用的是轮询算法,所以运行的时候,启动两个provider的时候,调用情况都是你一次,我一次
则我们需要修改权重的时候,可以在dubbo的管理后台点击服务治理——权重调节——编辑,可设置两个provider的不同权重,这时候调用就不再均衡了,可是有时候还是会持续均衡的调度,为什么呢,看一下代码
getWeight()
1 | protected int getWeight(Invoker<?> invoker, Invocation invocation) { |
calculateWarmupWeight()——降权算法
1 | static int calculateWarmupWeight(int uptime, int warmup, int weight) { |
所以我们看代码知道,只有在服务启动时间在十分钟以上的情况下,才能遵循设置的权重,否则,会调用降权算法,就达不到设置的权重了。
RandomLoadBalance类
在dubbo的管理后台点击服务治理——负载均衡——负载均衡策略——随机,这样就能dubug进入RandomLoadBalance类了
1 | public class RandomLoadBalance extends AbstractLoadBalance { |