Dubbo提供的负载均衡策略
Random
采用随机算法进行负载均衡,通常在对等集群组网中,随机路由算法消息分发还是比较均匀的。它的主要缺点有两个:
1) 在一个截面上碰撞的概率较高。
2) 非对等集群组网,或者硬件配置差异较大,会导致各节点负载不均匀。通常在实现上会采用JDK提供的java.util.Random或者java.security.SecureRandom在指定服务提供者地址列表中生成随机地址,消费者基于随机生成的服务提供者地址进行远程调用。RoundRobin
轮循,按公约后的权重设置轮循比率,到达边界之后,继续绕接。它的主要缺点是存在慢的提供者累积请求问题。比如第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
轮循策略的实现非常简单,它的原理就是按照权重,顺序循环遍历服务提供者列表,到达上限之后重新归零,继续顺序循环。LeastActive
消费者缓存所有服务提供者的服务调用时延,周期性的计算服务调用平均时延,然后计算每个服务提供者服务调用时延与平均时延的差值,根据差值大小动态调整权重,保证服务时延大的服务提供者接收更少的消息,防止消息堆积。
该策略的特点就是要保证处理能力强的服务提供者接收到更多的消息,通过动态自动权重调整消除服务调用时延的振荡范围,使所有服务提供者服务调用时延接近平均值,实现负载均衡。ConsistentHash
相同参数的请求总是发到同二个服务提供者,当某一台提供者若机时,原本发往该提供者的请求, 基于虚拟节点,平摊到其他提供者,不会引起剧烈变动。平台提供默认的虚拟节点数, 可以通过配置参数进行修改。
参考
- http://blog.codinglabs.org/articles/consistent-hashing.html
- 分布式服务框架原理与实践 李林峰 著