1. 首页
  2. >
  3. 数据库技术
  4. >
  5. Redis

谈谈高可用之降级

一、降级是高可用的一大利器

降级有如下分类:

1.自动降级和人工降级

2.读降级和写降级

3.多级降级

二、自动降级

1.超时降级

当调用数据库/HTTP服务/远程调用响应慢,且调用的服务是非核心服务,可以设置超时时间,超时后自动降级。比如,商品详情页的猜你喜欢,评价等内容,在大促时如果该服务出现问题或者响应慢的话,可以降级,它并不影响用户的购物主流程。

2.统计调用失败次数降级

有时系统会依赖一些不稳定的外部API,如果一定时间内调用失败次数超过阈值,可以自动降级,即断路器模式。降级后可以通过一个异步线程定时去探测该API是否恢复,恢复了则取消降级,关闭断路器。

3.限流降级

像秒杀/抢购这类大促活动,可能会因瞬时流量过大导致系统崩溃,我们就可以通过限流降级的手段,当流量达到之前压测报告的最大QPS/TPS时,后续流量会被降级,降级的方案可以向用户展示"当前参与活动人数过多,请稍后再试!"的页面,如果商品抢购完了,可以直接展示“商品已经被抢光了,谢谢参与!”,这种友好的降级方式,用户是可以接受的。

三、人工降级

人工降级通常指的是通过一个开关去完成降级的操作。这个开关通常放在易于修改和无需重启应用就生效的地方,比如分布式配置中心。比如,同步调用切换成异步,新服务有问题切回旧服务,某个机房挂了把流量切到另一个机房等等。还有一种情况,比如某个后台执行的定时任务(非核心)依赖的后台服务出现了问题,如连接池耗尽,数据库崩溃,慢查询等,可以通过开关暂停该任务。

四、读降级

读降级通常指的是,原本读DB的数据降级成读缓存,当然,这针对那些读一致性要求不高的业务场景,比如商品好评差评数,近期多少人看过这件商品等。还有一种读降级,就是直接在前端页面降级,当然这里也是指的非核心页面,这些也会占用系统资源,因此可以考虑在不影响用户核心服务的前提下做降级。原本是读后台的动态数据,改成读静态页面数据,也就是托底数据,在大促时这也是一种有效手段,起码比页面崩溃体验好。

五、写降级

写服务通常是不能降级的,例如下订单。但是我们也可以通过一些手段,来达到降级的目的。比如牺牲某段时间的强一致性,把同步改成异步,保证最终一致性即可。举个栗子,秒杀扣减库存的场景。我们很容易想到,把库存放在redis中,但是DB的库存怎么处理呢?方案一:先扣减redis库存,再扣减DB库存,DB扣减失败,则回滚redis库存。方案二:扣减redis库存,依旧正常扣减DB库存,性能扛不住时,扣减DB库存的操作降级为异步处理,比如发送一条消息(kafka等),然后异步消费消息去扣减库存,保证redis和DB库存数据的最终一致性。

六、多级降级

多级降级是什么意思呢?我们知道现在的系统,从浏览器/手机app请求到后台服务,是经过一条链路的,可以抽象为前端页面-> 网关接入层-> 后台服务层。这里的每个层次都可以考虑设置降级功能。前端页面可以通过js等手段,比如按钮置灰,请xx秒后重试,短信验证码就是个典型例子。接入层,比如nginx,在某个后台服务出现问题时,可以暂时摘除该服务,把请求切换到另一个正常服务。等故障服务恢复了,可以重新加入到集群中。服务层降级,通常指的是业务功能降级,某个接口出现调用流量过大,或者响应慢、不可用等情况,可以降级成预先设定的fallback方法。

七、开源的降级中间件

业界开源比较著名的应该就是Netflix的Hystrix和阿里的Sentinel了吧。学习Hystrix之前,建议先了解下 命令模式 ,因为Hystrix就用了这种设计模式,把请求封装成一个Command,然后根据情况,是执行目标方法还是执行fallback降级方法。整体流程图如下:

谈谈高可用之降级

Sentinel不仅可以做降级,也可以做限流,Hystrix的断路器也是一种限流手段。限流和降级通常是相辅相成的,限流后的结果通常就是降级。本文的主题是降级,所以只讲降级的部分。

从官网摘来的总体架构图如下:

谈谈高可用之降级

在 Sentinel 里面,所有的资源都对应一个资源名称( resourceName ),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:

NodeSelectorSlot ClusterBuilderSlot StatisticSlot FlowSlot AuthoritySlot DegradeSlot SystemSlot 

更多信息可以参考官方文档

https://github.com/alibaba/Sentinel/wiki/Sentinel%E5%B7%A5%E4%BD%9C%E4%B8%BB%E6%B5%81%E7%A8%8B

参考资料:

《亿级流量网站架构核心技术》