Dubbo专题:1.负载均衡

2019-02-20  本文已影响0人  北交吴志炜

dubbo的负载均衡实现类有
ConsistentHashLoadBalance 一致性hash,
LeastActiveLoadBalance 最少活跃调用,
RandomLoadBalance随机权重,
RoundRobinLoadBalance 轮询
他们的实现类都是AbstractLoadBalance

    public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) {
        if (CollectionUtils.isEmpty(invokers)) {
            return null;
        }
        if (invokers.size() == 1) {
            return invokers.get(0);
        }
        return doSelect(invokers, url, invocation);
    }

    protected abstract <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation);

select方法就是从invoker列表(服务列表)中选出一个invoker,实现类就是去实现这个doSelect方法。

RandomLoadBalance
每个服务对应一个权重,算法根据权重,计算一个总的权重和,然后使用随机数映射来获取负载结果
比如三个服务列表,权重分别是1,2,3 那么权重总和是6,生成一个最大6的随机数,生成1调用1号服务,生成2,3调用2号服务,其余调用3号服务,调用次数较多时,可以近似均匀的按权重分布,调用次数少时,可能不均匀。

LeastActiveLoadBalance
每一个服务对应一个活跃数active,初始0,收到请求,活跃数加1,完成请求,活跃数减1。活跃数越多,说明hung在该服务器的请求就越多,活跃数越少,说明该服务器越清闲。该算法将请求优先分配给活跃数最小的服务器,会结合权重

ConsistentHashLoadBalance

虚拟节点结合hash环的一种负载机制。

RoundRobinLoadBalance

最新版重构参考自 Nginx 的平滑加权轮询负载均衡。每个服务器对应两个权重,分别为 weight 和 currentWeight。其中 weight 是固定的,currentWeight 会动态调整,初始值为0。当有新的请求进来时,遍历服务器列表,让它的 currentWeight 加上自身权重。遍历完成后,找到最大的 currentWeight,并将其减去权重总和,然后返回相应的服务器即可。

上一篇下一篇

猜你喜欢

热点阅读