jadestoner

导航

 

LoadBalance (负载均衡)

Dubbo提供了为集群的负载均衡提供了一系列的平衡策略,默认的是 random
也可以自己写一个。

内置的策略

Random LoadBalance(随机)

  • Ramdom,根据权重随机
  • 调用的越多,分布越均匀。当使用权重时,结果也是与之一致的,可以根据它来帮助我们动态的改变provider的权重。

RoundRobin LoadBalance(轮询)

  • RoundRobin,
  • 流量流到性能差一点的providers时有可能会造成请求的堆积。假如一个provider处理请求的速度比较慢,但是它依然存活着,它任然会以正常的速度接收请求。通过轮询算法,consumers会按照预定的速率继续向provider发送请求,它并不能知道此时provider的状态已经很差了。最后,会有很多请求卡在那。

LeastActive LoadBalance

  • LeastActive,基于actives的一个随机算法,actives的意思是consumer 发出去了一些请求但是还没有返回。
  • 基于此,性能差一点的provider会分配到一些少一点的请求。

ConsistentHash LoadBalance

  • ConsistentHash,相同参数的请求总会被发送给同一个provider。
  • 当provider宕机了,原本发送给这个provider的请求,会根据虚拟节点的算法,比较均匀的分配给其他的provider,不会造成很剧烈的变化。
  • 一致性hash算法可以 http://en.wikipedia.org/wiki/Consistent_hashing
  • 默认只会根据第一个参数hash,可以配置进行修改
<dubbo:parameter key="hash.arguments" value="0,1" />
  • 默认的虚拟节点是160个,可以配置进行修改
<dubbo:parameter key="hash.nodes" value="320" />

Configuration(配置)

Server service level

<dubbo:service interface="..." loadbalance="roundrobin" />

Client service level

<dubbo:reference interface="..." loadbalance="roundrobin" />

Server method level

<dubbo:service interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>

Client method level

<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>

自定义负载均衡算法

  1. 拓展接口org.apache.dubbo.rpc.cluster.LoadBalance
  2. 配置如下
<dubbo:protocol loadbalance="xxx" />
或
<dubbo:provider loadbalance="xxx" />
  1. 算法实现:XxxLoadBalance.java:
package com.xxx;
 
import org.apache.dubbo.rpc.cluster.LoadBalance;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.RpcException; 
 
public class XxxLoadBalance implements LoadBalance {
    public <T> Invoker<T> select(List<Invoker<T>> invokers, Invocation invocation) throws RpcException {
        // ...
    }
}
  1. 配置SPI
META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance:
  1. 目录结构
src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxLoadBalance.java (LoadBalance implementation)
    |-resources
        |-META-INF
            |-dubbo
                |-org.apache.dubbo.rpc.cluster.LoadBalance (plain text file with the content: xxx=com.xxx.XxxLoadBalance)
posted on 2019-07-26 17:23  jadestoner  阅读(426)  评论(0编辑  收藏  举报