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>
自定义负载均衡算法
- 拓展接口org.apache.dubbo.rpc.cluster.LoadBalance
- 配置如下
<dubbo:protocol loadbalance="xxx" />
或
<dubbo:provider loadbalance="xxx" />
- 算法实现: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 {
// ...
}
}
- 配置SPI
META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance:
- 目录结构
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)