Author:赵志乾
Date:2019-05-11
Declaration:All Right Reserved!!!
dubbo作为一款成熟的rpc框架,在协议所定义的功能之上封装了许多额外的功能,如容错策略、负载均衡策略等等。其中,dubbo支持的负载均衡策略包括随机(Random)、轮询(RoundRobin)、最少活跃调用数(LeastActive)和一致性Hash(ConsistentHash),缺省配置为随机负载均衡测策略。
1、随机负载均衡策略和轮询负载均衡策略
这两种负载均衡策略都比较简单,其所面临的问题就是不会按照实际工作情况自适应。
2、最少活跃调用数
该策略是指将此次请求提交给当前时刻待处理请求数最少的实例进行处理,当存在多个实例均为最少活跃调用数时,则在这几个实例之间进行随机分配。由于该负载均衡策略是按照当前各实例的处理能力来分配请求的,所以能够依据实际的工作情况达到自适应效果。
3、一致性hash
该策略能够保证在服务提供者列表不变的情况下,相同参数的请求总是发送到同一个服务提供者。其相对于普通hash的优点就是通过引入虚拟节点来降低因服务提供者故障而产生的波动。默认情况下,一致性hash会使用160个虚拟节点来构造一致性hash环,并且只使用方法的第一个参数的hash值作为key来获取服务提供者对象(即Invoker)。
注1:使用一致性hash负载均衡策略的配置方式:
<!--使用第一个和第2个参数的hash值来定位hash环上的Invoker对象-->
<dubbo:parameter key="hash.arguments" value="0,1">
<!--一致性hash环使用320个虚拟节点-->
<dubbo:parameter key="hash.nodes" value="320">
注2:一致性hash负载均衡策略的工作流程:
首先selectors对象(是ConcurrentMap)会存放每个请求url(interface+group+version+methodName)和一致性hash环对象的映射。则请求到来时获取相应Invoker的流程:通过请求url在selectors中获取一致性hash环对象,然后通过请求参数的hash值在一致性hash环上查找对应的虚拟节点,最后获得服务实例Invoker。