一、降级是高可用的一大利器
降级有如下分类:
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
则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;StatisticSlot
则用于记录、统计不同纬度的 runtime 指标监控信息;FlowSlot
则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;AuthoritySlot
则根据配置的黑白名单和调用来源信息,来做黑白名单控制;DegradeSlot
则通过统计信息以及预设的规则,来做熔断降级;SystemSlot
则通过系统的状态,例如 load1 等,来控制总的入口流量
更多信息可以参考官方文档
https://github.com/alibaba/Se...
参考资料:
《亿级流量网站架构核心技术》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。