美文网首页
系统降级

系统降级

作者: 陆遥远 | 来源:发表于2017-11-26 20:39 被阅读0次

什么是降级

Year GMV
2017 1682.00 亿
2016 1207.48 亿
2015 912.00 亿
2014 571.00 亿

2015年双11,下午四五点左右确认收货被停掉。
2014年双11, 商品评论功能被停掉。


image.png

高可用系统为了保证自身的高可用性,会在异常情况下限制自身的一些能力,来保证核心功能的可用性。这有点类似武侠小说里面的壮士断腕,也有点类似于象棋里面的弃车保帅。

为什么需要降级?

在系统复杂度越来越高的今天,我们可能会经常遇到这样的困扰:一个非核心的功能异常最终导致了整个系统的不可用。比如一个获取非核心数据接口的超时最终导致了整个线程池全部阻塞,影响了核心功能线程的运行;业务链条中某个环节的接口不可用导致整个业务链的失败。这样的例子比比皆是,造成的损失往往也非常大,所以为了避免这种小功能搞垮大系统的情况发生,降级的概念就应运而生了

降级预案

在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级。

一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;

错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;

严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。

降级的类别

  • 降级按照是否自动化可分为:自动开关降级和人工开关降级。
  • 降级按照功能可分为:读服务降级、写服务降级。
  • 降级按照处于的系统层次可分为:多级降级。

降级的功能点

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

页面降级:在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅;

页面片段降级:比如商品详情页中的商家部分因为数据错误了,此时需要对其进行降级;

页面异步请求降级:比如商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,可以进行降级;

服务功能降级:比如渲染商品详情页时需要调用一些不太重要的服务:相关分类、热销榜等,而这些服务在异常情况下直接不获取,即降级即可;

读降级:比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景;

写降级:比如秒杀抢购,我们可以只进行Cache的更新,然后异步同步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。

爬虫降级:在大促活动时,可以将爬虫流量导向静态页或者返回空数据从而降级保护后端稀缺资源。

降级策略

1、自动开关降级

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

image.png

超时降级

当访问的数据库/http服务/远程调用响应慢或者长时间响应慢,且该服务不是核心服务的话可以在超时后自动降级;

比如商品详情页上有推荐内容/评价,但是推荐内容/评价暂时不展示对用户购物流程不会产生很大的影响;

对于这种服务是可以超时降级的。如果是调用别人的远程服务,和对方定义一个服务响应最大时间,如果超时了则自动降级。

统计失败次数降级

有时候依赖一些不稳定的API,比如调用外部机票服务,当失败调用次数达到一定阀值自动降级;然后通过异步线程去探测服务是否恢复了,则取消降级。

故障降级

比如要调用的远程服务挂掉了(网络故障、DNS故障、http服务返回错误的状态码、rpc服务抛出异常),则可以直接降级。

降级后的处理方案有:

默认值(比如库存服务挂了,返回默认现货)

兜底数据(比如广告挂了,返回提前准备好的一些静态页面)

缓存(之前暂存的一些缓存数据)

限流降级

当我们去秒杀或者抢购一些限购商品时,此时可能会因为访问量太大而导致系统崩溃,此时开发者会使用限流来进行限制访问量,当达到限流阀值,后续请求会被降级;

降级后的处理方案可以是:

排队页面(红包)

无货(直接告知用户没货了)

错误页(如活动太火爆了,稍后重试)

2、人工开关降级

  • 在大促期间通过监控发现线上的一些服务存在问题,这个时候需要暂时将这些服务摘掉;
  • 还有有时候通过任务系统调用一些服务,但是服务依赖的数据库可能存在:网卡被打满了、挂掉了或者很多慢查询,此时需要暂停下任务系统让服务方进行处理;
  • 还有发现突然调用量太大,可能需要改变处理方式(比如同步转换为异步);

此时就可以使用开关来完成降级

开关可以存放到配置文件、存放到数据库、存放到Redis/ZooKeeper;如果不是存放在本地,可以定期同步开关数据(比如1秒同步一次)。然后通过判断某个KEY的值来决定是否降级。

另外对于新开发的服务想上线进行灰度测试;但是不太确定该服务的逻辑是否正确,此时就需要设置开关,当新服务有问题可以通过开关切换回老服务。

还有多机房服务,如果某个机房挂掉了,此时需要将一个机房的服务切到另一个机房,此时也可以通过开关完成切换。

还有一些是因为功能问题需要暂时屏蔽掉某些功能,比如商品规格参数数据有问题,数据问题不能用回滚解决,此时需要开关控制降级。

3、读服务降级

对于读服务降级一般采用的策略有:

暂时切换读(降级到读缓存、降级到走静态化)

暂时屏蔽读(屏蔽读入口、屏蔽某个读服务)

还有一种是页面静态化场景:

动态化降级为静态化:比如平时网站可以走动态化渲染商品详情页,但是到了大促来临之际可以将其切换为静态化来减少对核心资源的占用,而且可以提升性能;其他还有如列表页、首页、频道页都可以这么玩;可以通过一个程序定期的推送静态页到缓存或者生成到磁盘,出问题时直接切过去;

静态化降级为动态化:比如当使用静态化来实现商品详情页架构时,平时使用静态化来提供服务,但是因为特殊原因静态化页面有问题了,需要暂时切换回动态化来保证服务正确性。

以上都保证出问题了有预案,用户还是可以使用网站,不影响用户购物。

4、写服务降级

写服务在大多数场景下是不可降级的,不过可以通过一些迂回战术来解决问题。比如将同步操作转换为异步操作,或者限制写的量/比例。

5、多级降级

缓存是离用户最近越高效;而降级是离用户越近越能对系统保护的好。因为业务的复杂性导致越到后端QPS/TPS越低。

页面JS降级开关:主要控制页面功能的降级,在页面中通过JS脚本部署功能降级开关,在适当时机开启/关闭开关;

接入层降级开关:主要控制请求入口的降级,请求进入后会首先进入接入层,在接入层可以配置功能降级开关,可以根据实际情况进行自动/人工降级;

应用层降级开关:主要控制业务的降级,在应用中配置相应的功能开关,根据实际业务情况进行自动/人工降级。

( 参考链接)[http://www.yunweipai.com/archives/8627.html]
(参考链接)
http://fengfu.io/2017/04/23/%E6%9C%8D%E5%8A%A1%E5%8C%96%E6%9E%B6%E6%9E%84-%E6%9C%8D%E5%8A%A1%E9%99%8D%E7%BA%A7/

相关文章

  • 系统降级

    业务分类 A 必要 必须要保证正常运行 B 有的话更好 缓存 放弃一些一致性的东西 或者准确性的 C 可放弃 ...

  • 系统降级

    什么是降级 2015年双11,下午四五点左右确认收货被停掉。2014年双11, 商品评论功能被停掉。 高可用系统为...

  • 降级、熔断

    降级,系统在调用服务时,服务方异常,调用方切换备用接口或返回备用数据;系统自身异常,返回降级数据 熔断,系统在调用...

  • 限流

    在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流缓存:缓存的目的是提升系统访问速度和增大系统处理容量降级...

  • SpringCloud Alibaba Sentinel

    流控规则 服务降级 Sentinel系统规则

  • 架构成长之路:分布式系统限流策略(一)

    在开发高并发的系统时,有很多手段来保护系统,如缓存、降级和限流等。缓存可以提升系统的访问速度,降级可以暂时屏蔽掉非...

  • 分布式系统限流策略(一)

    在开发高并发的系统时,有很多手段来保护系统,如缓存、降级和限流等。缓存可以提升系统的访问速度,降级可以暂时屏蔽掉非...

  • Sentinel源码分析----降级熔断规则与DegradeSl

    上篇文章讲了流控规则,而除了流控规则之后还有降级、热点、系统、授权等规则,这篇文件主要讲降级规则。 降级规则主要处...

  • macOS系统降级

    在 Mac 上使用 Safari 浏览器下载 macOS Safari 浏览器会使用以下链接在 App Store...

  • 高并发之限流

    目录 概念 划分 线上情况 概念 在开发分布式高并发系统时有三把利器用来保护系统:缓存、降级、限流。其中降级的一种...

网友评论

      本文标题: 系统降级

      本文链接:https://www.haomeiwen.com/subject/qxclbxtx.html