Dubbo源码学习--RandomLoadBalance负载均衡(二)
·
Random LoadBalance
- 随机,按权重设置随机概率。
- 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RandomLoadBalance中会根据每个服务调用的权值次数来进行随机数,这样权值越大,动态调整越均衡。
public class RandomLoadBalance extends AbstractLoadBalance {
public static final String NAME = "random";
private final Random random = new Random();
protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
int length = invokers.size(); // 可调用的服务提供方总数
int totalWeight = 0; // 总数权重值
boolean sameWeight = true; // 一开始每一个服务提供方权值一样
for (int i = 0; i < length; i++) {
int weight = getWeight(invokers.get(i), invocation);//获取每一个服务提供方的权值
totalWeight += weight; // 计算权值总数
if (sameWeight && i > 0
&& weight != getWeight(invokers.get(i - 1), invocation)) {
sameWeight = false;
}
}
if (totalWeight > 0 && !sameWeight) {
// If (not every invoker has the same weight & at least one invoker's weight>0), select randomly based on totalWeight.
//如果权值不一样,则从总的权值中选择一个
int offset = random.nextInt(totalWeight);
// Return a invoker based on the random value.
for (int i = 0; i < length; i++) {
//不断的减去权值,当权值小于0时直接返回
offset -= getWeight(invokers.get(i), invocation);
if (offset < 0) {
return invokers.get(i);
}
}
}
//如果所有的服务的权值一样的话,直接随机并返回
// If all invokers have the same weight value or totalWeight=0, return evenly.
return invokers.get(random.nextInt(length));
}
}更多推荐

所有评论(0)