Dubbo服务限流
为了防止某个消费者的QPS或是所有消费者的QPS总和突然飙升而导致的重要服务的失效,系统可以对访问流量进行控制,这种对集群的保护措施称为服务限流。
Dubbo中能够实现服务限流的方式较多,可以划分为两类:
直接限流
通过对连接数量直接进行限制来达到限流的目的。
间接限流
通过一些非连接数量设置来达到限制流量的目的
一、executes直接限流– 仅提供者端
该属性仅能设置在提供者端。可以设置为接口级别,也可以设置为方法级别。限制的是服务(方法)并发执行数量。
类级别,服务器端并发执行(或占用线程池线程数)不能超过 10 个
<dubbo:service interface="com.demo.dubbo.api.UserService" executes="10" />
方法级别,服务器端并发执行(或占用线程池线程数)不能超过 10 个
<dubbo:service interface="com.demo.dubbo.api.UserService">
<dubbo:method name="SayHello" executes="10" />
</dubbo:service>
二、accepts限流 – 仅提供者端
该属性仅可设置在提供者端的dubbo:provider/与dubbo:protocol/。用于对指定协议的连接数量进行限制
<dubbo:provider protocol=“dubbo” accepts=“10”/>
或
<dubbo:protocol name=“dubbo” port=“20880” accepts=“10”/>
三、actives限流 – 两端
该限流方式与前两种不同的是,其可以设置在提供者端,也可以设置在消费者端。可以设置为接口级别,也可以设置为方法级别
A、提供者端限流
根据消费者与提供者间建立的连接类型的不同,其意义也不同
长连接:表示当前长连接最多可以处理的请求个数。与长连接的数量没有关系
短连接:表示当前服务可以同时处理的短连接数量
类级别
<dubbo:service interface=“com.demo.dubbo.api.UserService” actives=“10” />
方法级别
<dubbo:reference interface=“com.foo.BarService”>
<dubbo:method name=“SayHello” actives=“10” />
</dubbo:service>
B、消费者端限流
根据消费者与提供者间建立的连接类型的不同,其意义也不同:
长连接:表示当前消费者所发出的长连接中最多可以提交的请求个数。与长连接的数量没有关系。
短连接:表示当前消费者可以提交的短连接数量
类级别
<dubbo:reference interface="com.demo.dubbo.api.UserService" actives="10" />
方法级别
<dubbo:reference interface="com.demo.dubbo.api.UserService">
<dubbo:method name="SayHello" actives="10" />
</dubbo:reference>
四、 connections限流
可以设置在提供者端,也可以设置在消费者端。限定连接的个数。对于短连接,该属性效果与actives相同。但对于长连接,其限制的是长连接的个数。
一般情况下,会使connectons与actives联用,让connections限制长连接个数,让actives限制一个长连接中可以处理的请求个数。联用前提:使用默认的Dubbo服务暴露协议
A、提供者端限流
类级别
<dubbo:service interface=“com.demo.dubbo.api.UserService” ref=“userService” connections=“10”/>
方法级别
<dubbo:service interface=“com.demo.dubbo.api.UserService”>
<dubbo:method name=“SayHello” connections=“10” />
</dubbo:service>
B、消费者端限流
类级别
<dubbo:reference interface=“com.demo.dubbo.api.UserService” connections=“10” />
方法级别
<dubbo:reference interface=“com.demo.dubbo.api.UserService”>
<dubbo:method name=“SayHello” connections=“10” />
</dubbo:reference>
五、间接限流
延迟连接 – 仅消费者端
仅可设置在消费者端,且不能设置为方法级别。仅作用于Dubbo服务暴露协议。
将长连接的建立推迟到消费者真正调用提供者时。
可以减少长连接的数量
<dubbo:reference id="userService" lazy="true"
interface="com.demo.dubbo.api.UserService"/>
<dubbo:consumer lazy="true"></dubbo:consumer>
六、粘连连接 – 仅消费者
仅能设置在消费者端,其可以设置为接口级别,也可以设置为方法级别。仅作用于Dubbo服务暴露协议
其会使客户端尽量向同一个提供者发起调用,除非该提供者挂了,其会连接另一台。只要启用了粘连连接,其就会自动启用延迟连接
其限制的是流向,而非流量
类级别
<dubbo:reference interface=“com.demo.dubbo.api.UserService” sticky=“true” />
方法级别
<dubbo:service interface=“com.demo.dubbo.api.UserService”>
<dubbo:method name=“SayHello” sticky=“true” />
</dubbo:service>
七、负载均衡
可以设置在消费者端,亦可设置在提供者端;可以设置在接口级别,亦可设置在方法级别。其限制的是流向,而非流量
<dubbo:reference interface="...">
<dubbo:method name="..."loadbalance="roundrobin"/>
</dubbo:reference>