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));
    }

}

更多推荐