当服务出现问题,要保证服务起码可用,即使服务是有损的,这时候就需要使用降级策略,返回“不那么完善”的服务。另一层含义是,当系统资源紧张时,对非核心业务进行降级,保证核心业务的稳定
5.1 降级预案
梳理出哪些服务需要保护,哪些可降级。
按照是否自动化分为:自动开关降级和人工开关降级
按照功能分为:读服务降级和写服务降级
按照处于系统层次分为:多级降级
5.2 自动开关降级
5.2.1 超时降级
访问非核心接口超时或响应慢,可以在超时后自动降级
5.2.2 统计失败次数降级
当访问某些接口经常异常,达到一定阈值后自动降级(熔断器)。然后通过异步线程去探测服务是否恢复,恢复则取消降级
5.2.3 故障降级
调用的服务挂掉了,可以直接降级。降级后的处理方案有:默认值,兜底数据,缓存
5.2.4 限流降级
被限流机制阻挡的请求,返回错误中或排队页面
5.3 人工开关降级
区别主要是由人工来干预,手动降级。比如新开发的功能有问题,手动切换到旧服务。
5.4 读服务降级
暂时切换读(降级到读缓存、降级到走静态化)、暂时屏蔽读(屏蔽读入口、屏蔽某个读服务)
5.5 写服务降级
主要为了保护数据库,将同步写转成异步写,或者写缓存,再异步写数据库
5.6 多级降级
降级离用户越近越对系统保护的好。因为越接近用户,流量越大,此时降级能拦住大部分流量。
页面JS降级开关,主要控制页面功能的降级
接入层降级开关,后端服务前的一道防线
应用层降级开关,控制业务降级
5.7 配置中心
手动降级的实现方式,将开关配置放到配置中心,比如apollo,做到不重启即可动态配置开关。
5.8 使用Hystrix实现降级
当正常方法超时或异常时,如果启用了降级处理,调用getFallback进行降级
5.9 使用Hystrix实现熔断
通过allowRequest判断是否熔断了,如果没有走正常处理,否则调用getFallback进行降级。
allowRequest方法,判断熔断开关是否打开(isOpen),如果关闭根据统计信息判断是否需要打开,否则走正常方法。如果打开,其快速恢复机制,允许一个时间窗口内,进行一次测试,看看是否已经恢复,如果恢复则将熔断开关关闭,否则都走降级方法。
这个方法中调用了isOpen方法,其作用是根据采样次数,判断是否需要打开熔断开关,如果失败率超过阈值,那么打开熔断开关,并返回true。
熔断器开关的状态:
闭合:当熔断开关闭合时,不启动熔断机制,不降级
打开:当熔断开关打开时,启用熔断机制,调用降级方法
半打开:当熔断处于打开状态,在一个时间窗口内有一次重试机会,此时称为半打开。如果重试成功,则恢复闭合,重试失败则变成打开状态。
5.9.3 采样统计
Hystrix在内存中存储采样数据,支持三种采样
1. 计数统计:统计一个时间窗口内的失败、超时、线程池拒绝、信号量拒绝数量,记录N组,统计使用前N-1组。比如一个窗口时间10秒,每秒记录一组。
2. 最大并发数统计
3. 延迟百分比统计