降级预案

日志级别

需要对系统进行梳理,哪些是可以降级的,哪些是需要誓死保护的,可以参考日志级别。

  1. 一般:有些服务因为网络抖动或者服务上线而超时,可以自动降级。
  2. 警告:有些服务成功率有波动(95%-100%之间),可以自动降级或人工降级,并发送警告。
  3. 错误:比如错误率低于 90%,或者数据库连接池爆了,或者访问量猛增到系统承受的最大阀值,可以根据情况自动降级或者人工降级。
  4. 严重错误:特殊原因数据错误,此时需要紧急人工降级。

完整链路降级

降级的功能点主要从服务端链路考虑,即根据用户访问的服务调用链路来梳理哪里需要降级

  1. 页面降级:在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅;
  2. 页面片段降级:比如商品详情页中的商家部分因为数据错误了,此时需要对其进行降级;
  3. 页面异步请求降级:比如商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,可以进行降级;
  4. 服务功能降级:比如渲染商品详情页时需要调用一些不太重要的服务:相关分类、热销榜等,而这些服务在异常情况下直接不获取,即降级即可;
  5. 读降级:比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景;
  6. 写降级:比如秒杀抢购,我们可以只进行Cache的更新,然后异步同步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
  7. 爬虫降级:在大促活动时,可以将爬虫流量导向静态页或者返回空数据,从而保护后端稀缺资源。

自动降级策略

自动降级是根据系统负载,资源使用情况,SLA 等指标进行降级

  1. 超时降级:当访问的数据库/http服务/远程调用响应慢或者不响应可以设置超时自动降级。
  2. 统计失败次数降级:有时候依赖一些不稳定的API,比如调用外部机票服务,当失败调用次数达到一定阀值自动降级;然后通过异步线程去探测服务是否恢复了,则取消降级。
  3. 故障降级:当调用的远程服务挂掉了(网络故障,DNS 故障,http 服务返回错误的状态码,RPC 服务抛出异常),则可以直接降级。
  4. 限流降级:当我们去秒杀或者抢购一些限购商品时,此时可能会因为访问量太大而导致系统崩溃,此时开发者会使用限流来进行限制访问量,当达到限流阀值,后续请求会被降级;降级后的处理方案可以是:排队页面(将用户导流到排队页面等一会重试)、无货(直接告知用户没货了)、错误页(如活动太火爆了,稍后重试)。

降级方式

  1. 人工开关降级:在大促期间通过监控发现线上的一些服务存在问题,这个时候需要暂时将这些服务摘掉。
  2. 读服务降级:对于读服务降级一般采用的策略有:暂时切换读(降级到读缓存、降级到走静态化)、暂时屏蔽读(屏蔽读入口、屏蔽某个读服务)。
  3. 写服务降级:一刀切停止写服务,或者写入消息队列

限流算法

  1. 计数器法:实现简单,精度不高,重置节点时无法处理突发请求
  2. 滑动窗口:滑动窗口的窗口越小,则精度越高,相应的资源消耗也更高。
  3. 漏桶算法 : 限制的是流出速率,突发请求要排队,对服务保护较好;流入随机,流出固定
  4. 令牌桶算法 :限制的是平均流入速率,允许一定程度突发请求(无需排队)。

限流方法对比

计数器 VS 滑动窗口 计数器算法是最简单的算法,可以看成是滑动窗口的低精度实现。滑动窗口由于需要存储多份的计数器(每一个格子存一份),所以滑动窗口在实现上需要更多的存储空间。也就是说,如果滑动窗口的精度越高,需要的存储空间就越大。

令牌桶和漏桶对比:

令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求;漏桶则是按照常量固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝; 令牌桶限制的是平均流入速率,允许一定的突发请求;而漏桶主要目的是平滑流出速率;

开源限流组件

  1. alibaba/Sentinel
  2. Netflix/Hystrix

参考
https://blog.csdn.net/ityouknow/article/details/81230412
https://www.jianshu.com/p/1dbc1a19fa8c