乐趣区

关于后端:谈谈高可用之降级

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

降级有如下分类:
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…

参考资料:
《亿级流量网站架构核心技术》

退出移动版