服务降级
解决高并发的三把利器:降级、限流、缓存。
服务降级基础
什么是服务降级
- 服务降级,当服务器压力剧增情况下,根据当前业务的情况及流量对一些服务有策略地降低服务级别,以释放服务器资源,保证核心人物的正常运行。
服务降级方式
- 部分服务暂停
- 全部服务暂停
- 随机拒绝服务
- 部分服务延迟
服务降级埋点
服务降级与Mock机制
Dubbo的服务降级,采用Mock机制。其具有两种降级处理方式:Mock Null降级处理,与Mock Class降级处理
Mock Null降级处理
- 消费者服务降级代码配置
<dubbo:reference id="demoService" mock="return null" interface="com..."/>
Mock Class降级处理
- 消费者服务降级代码配置
<dubbo:reference id="demoService" mock="true" interface="com..."/>
- 代码规范
//1、Mock class DemoServiceMock,即接口类名称+Mock
//2、和接口必须在同一个包里,即相同目录下
public class DemoServiceMock implements DemoService{
@Override
public String testReturn(){
return "哈哈降级啦";
}
@Override
public void testVoid(){
log.info("呵呵降级啦");
}
}
服务限流
为了防止某个消费者的QPS,或者所有消费者的QPS总和突然飙升导致某些重要的服务失败,系统可以对访问流量进行限制,这种对集群的保护措施称为服务限流。
Dubbo中可以实现现有的方案比较多,可以划分为两类:直接限流和间接限流
直接限流:通过对连接数据进行限制来到底限流的目的。(官方方案)
间限限流:通过一些非连接数量设置来到的限流的目的。
直接限流
executes限流
改属性仅能设置在提供者端。可以设置为接口或方法级别。
限制的是接口(或方法)并发执行数量。
<!--限制接口中的每个方法的并发数量不能超过10个-->
<dubbo:service interface="com...DemoService" ref="demoService" executes="10"/>
accepts限流
该属性仅可设置在提供者端 <dubbo:provide>与<dubbo:protocol>
用于对指定协议的连接数量进行限制
<!--限制当前提供者使用dubbo协议时最多接受10个消费者连接-->
<dubbo:provide protocol="dubbo" accepts="10"/>
<!--限制当前提供者使用dubbo协议时最多接受10个消费者连接-->
<dubbo:protocol name="dubbo" port="20880" accepts="10"/>
actives限流
可以设置在提供者端或消费者端。
可以设置成接口级别和方法级别。
- 提供者端限流
- 其根据消费者和提供者间建立的连接类型的不同,其意义也不同:
- 长连接:表示当前长连接最多处理的请求的个数,与长连接的数量没有关系。
- 断连接:表示当前可以同时处理的短链接数量。
<dubbo:service interface="com...DemoService" ref="demoService" actives="10"/>
- 消费者端
- 其根据消费者和提供者间建立的连接类型的不同,其意义也不同:
- 长连接:表示当前消费者所发出的长连接中最多可以提交的请求个数,与长连接的数量没有关系。
- 断连接:表示当前消费者可以提交的短链接数量。
<dubbo:reference id="demoService" interface="com..." actives="10"/>
connections限流
可以设置在提供者端或消费者端,限定连接的个数。
可以设置成接口级别和方法级别。
- 对于短链接,其相当于actives限流
- 对于长连接,其设置的是长连接的数量。
- 一般情况下,使用connections和actives同时使用,让connections限制长连接的个数,让actives限制一个长连接中的请求的个数。联用前提,必须使用dubbo协议。
间接限流
- 延迟连接
仅可设置下消费者端,且不能设置方法级别。仅作用于Dubbo服务暴漏协议。
将长连接的建立推迟到消费者调用提供者时。
<!--设置当前消费者对指定接口的每一个方法发出的连接均采用延迟连接-->
<dubbo:reference id="demoService" interface="com..." lazy="true"/>
<!--设置当前消费者对所有接口的所有方法发出的连接均采用延迟连接-->
<dubbo:consumer lazy="true"/>
- 粘连连接
仅可设置下消费者端,可以设置在接口和方法级别上。仅作用于Dubbo服务暴漏协议。
其会使客户端尽量向同一个提供者发起调用,除非该提供者挂了,其后连接另一个。
只要启用了粘连连接,其会自动启用延迟连接
其限制的是流向,而不是流量。
<!--设置当前消费者对指定接口的每一个方法开启粘连连接-->
<dubbo:reference id="demoService" interface="com..." sticky="true"/>
- 负载均衡
可以设置在提供者端或消费者端。
可以设置成接口级别和方法级别。
其限制的是流向,而不是流量。
<!--通过指定负载均衡策略为leastactive来达到限流的目的-->
<dubbo:service interface="com...DemoService" ref="demoService" loadbalance="leastactive"/>