降级预案
在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅,从而梳理出哪些必须誓死保护,哪些可降级。
可以参考日志级别设置预案:
-
一般: 比如,有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级。
-
警告: 有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警。
-
错误: 比如,可用率低于90%,或者数据库连接池用完了,或者访问量突然猛增到系统能承受的最大阈值,此时,可以根据情况自动降级或者人工降级。
-
严重错误: 比如,因为特殊原因数据出现错误,此时,需要紧急人工降级。
降级按照是否自动化可分为:自动开关降级和人工开关降级。
降级按照功能可分为:读服务降级和写服务降级。
降级按照处于的系统层次可分为:多级降级。
降级的功能点主要从服务器端链路考虑,即根据用户访问的服务调用链路来梳理哪里需要降级。
-
页面降级: 在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅的目的。
-
页面片段降级 :比如,商品详情页中的商家部分因为数据错误,此时,需要对其进行降级。
-
页面异步请求降级: 比如,商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,则可以进行降级。
-
服务功能降级: 比如,渲染商品详情页时,需要调用一些不太重要的服务(相关分类、热销榜等),而这些服务在异常情况下直接不获取,即降级即可。
-
读降级: 比如,多级缓存模式,如果后端服务有问题,则可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景。
-
写降级: 比如,秒杀抢购,我们可以只进行Cache的更新,然后异步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
-
爬虫降级: 在大促活动时,可以将爬虫流量导向静态页或者返回空数据,从而保护后端稀缺资源。
-
风控降级 :如抢购/秒杀等业务,完全可以识别机器人、用户画像或者根据用户风控级别进行降级处理,直接拒绝高风险用户。
自动开关降级
超时降级
当访问的数据库/HTTP 服务/远程调用响应慢或者长时间响应慢,且该服务不是核心服务的话,可以在超时后自动降级。比如,商品详情页上有推荐内容/评价,但是,推荐内容/评价暂时不展示,对用户购物流程不会产生很大影响。对于这种服务是可以超时降级的。如果是调用别人的远程服务,则可以和对方定义一个服务响应最大时间,如果超时了,则自动降级。
统计失败次数降级
有时依赖一些不稳定的API,比如,调用外部机票服务,当失败调用次数达到一定阈值自动降级(熔断器)。然后通过异步线程去探测服务是否恢复了,恢复则取消降级。
故障降级
比如,要调用的远程服务挂掉了(网络故障、DNS故障、HTTP服务返回错误的状态码、RPC服务抛出异常),则可以直接降级。降级后的处理方案有:默认值(比如库存服务挂了,返回默认现货)、兜底数据(比如广告挂了,返回提前准备好的一些静态页面)、缓存(之前暂存的一些缓存数据)。
限流降级
当我们去秒杀或者抢购一些限购商品时,可能会因为访问量太大而导致系统崩溃,此时,开发者会使用限流来限制访问量,当达到限流阈值时,后续请求会被降级。降级后的处理方案可以是:排队页面(将用户导流到排队页面等一会儿重试)、无货(直接告知用户没货了)、错误页(如活动太火爆了,稍后重试)。
多级降级
缓存是离用户越近越高效,而降级是离用户越近越对系统保护得好。因为业务的复杂性导致越到后端QPS/TPS越低。
-
页面 JS降级开关 :主要控制页面功能的降级,在页面中,通过JS脚本部署功能降级开关,在适当时机开启/关闭开关。
-
接入层降级开关 :主要控制请求入口的降级,请求进入后,会首先进入接入层,在接入层可以配置功能降级开关,可以根据实际情况进行自动/人工降级。这个可以参考第17章,尤其在后端应用服务出问题时,通过接入层降级从而给应用服务有足够的时间恢复服务。
-
应用层降级开关 :主要控制业务的降级,在应用中配置相应的功能开关,根据实际业务情况进行自动/人工降级。
通过配置中心管理降级开关。
使用Hystrix实现降级、熔断。
采样统计
Hystrix在内存中存储采样数据,支持如下三种采样:
- BucketedCounterStream: 计数统计,比如记录一定时间窗口内的失败、超时、线程池拒绝、信号量拒绝数量,记录N 组。写入数据时写到第N 组,统计时使用前N -1组数据,因为第N 个刚开始统计时是随时变化的。然后基于时间滚转采样分组即可。
采样统计滚转时间窗口为10s,每秒1个分组(桶),即每秒采样一次,每个分组记录着当前桶的成功、失败、超时、线程拒绝统计数量。
- RollingConcurrencyStream :最大并发数统计,如Command/ThreadPool的最大并发数。
- RollingDistributionStream: 延时百分比统计,同HystrixRollingNumber类似,差别在于其是百分位数的统计。比如每组记录P(比如100)个数值,统计时使用前N -1组数据,将分组内数据按从小到大排序,然后累加,处于第p %位置的数值就是p 百分位数,通过它可以实现P50、P99、P999,Hystrix用来统计时延的分布情况。