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