美文网首页
高并发系统开发之降级实战

高并发系统开发之降级实战

作者: 先生zeng | 来源:发表于2020-04-23 15:09 被阅读0次

    说到降级,其实很多人都知道,当我们访问量剧增、服务出现问题就需要降级,保证核心服务或者服务基本可用。

    降级的核心目的就是要保证服务基本可用的,一般我们可以通过配置中心配置或人工配置一些关键数据,去进行降级。也可以手动进行降级。同时,需要注意的是,降级也需要根据系统的吞吐量、响应时间、可用率等条件进行手工降级或自动降级。

    大多数人都是知道什么是降级,但是具体的操作,相信大多数人还是不知道的,这篇文章就是主要介绍怎么样降级,如何优雅的进行降级。下面是这篇文章的一些内容:

    1 降级预案
    2 自动开关降级
    3 人工开关降级
    4 读服务降级
    5 写服务降级
    6 多级降级
    7、具体实现
    使用Hystrix实现降级
    使用Hystrix实现熔断
    8 其他(配置中心这种)

    一、降级预案

    一般在降级之前,我们需要进行一些预案,涉及到对哪些系统进行降级,如何降级,降级方案。。。。比如,可以参考日志级别设置预案。
    下面是日志级别:
    一般:比如,有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级。
    • 警告:有些服务在一 段时间内成功率有波动 (如在95-100% 之间),可以自动降级或人工降级,并发送告警。
    • 错误:比如,可用率低于90%, 或者数据库连接池用完了,或者访问量突然猛增到系统能承受的最大阙值,此时,可以根据情况自动降级或者人工降级。
    • 严重错误:比如,因为特殊原因数据出现错误,此时,需要紧急人工降级。

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

    我们在降级时,主要从服务器端链路去考虑,用户访问了哪些调用链路来梳理,哪里需要降级。

    • 页面降级: 在秒杀或者大促销的时候,一些页面占据了一些稀缺的资源,紧急情况下可以对整个页面降级。
    • 页面片段降级: 页面的某些不重要的数据错误,可以对其降级,不显示。
    • 服务功能降级:比如,渲染商品详情页时,需要调用一 些不太重要的服务 (相关分类、热销榜等),而这些服务在异常情况下直接不获取,即降级即可。
    • 读降级:比如,多级缓存模式,如果后端服务有问题,则可以降级为只读缓存,这种方式适用于对读一 致性要求不高的场景。
    • 写降级:比如,秒杀抢购,我们可以只进行Cache的更新,然后异步扣减库存到DB , 保证最终一 致性即可,此时可以将DB降级为Cache。
    • 风控降级:如抢购/秒杀等业务,完全可以识别机器人、用户画像或者根据用户风控级别进行降级处理,直接拒绝高风险用户。

    二、自动开关降级

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

    我们可以根据以下一些指标和方式进行降级:

    1. 超时
      当访问的数据库/HTTP服务/远程调用响应慢或者长时间响应慢,且该服务不是核心服务的话,可以在超时后自动降级。在实际场景中一 定要配置好超时时间和超时重试次数及机制

    2. 统计失败次数降级
      调用外部服务,当失败调用次数达到一 定阙值自动降级(熔断器)。然后通过异步线程去探测服务是否恢复了,恢复则取消降级。

    3. 故障降级
      要调用的远程服务挂掉了(网络故障、DNS故障、HTTP服务返回错误的状态码、RPC服务抛出异常),则可以直接降级。降级后的处理方案有:默认值(比如库存服务挂了,返回默认现货)、兜底数据(比如广告挂了,返回提前准备好的一 些静态页面)、缓存(之前暂存的一 些缓存数据)。

    4. 限流降级
      当我们去秒杀或者抢购一 些限购商品时,可能会因为访问量太大而导致系统崩溃,此时,开发者会使用限流来限制访问量,当达到限流阙值时,后续请求会被降级。降级后的处理方案可以是:排队页面(将用户导流到排队页面等一 会儿重试)、无货 (直接告知用户没货了)、错误页(如活动太火爆了,稍后重试)。

    三、人工开关降级

    在大促期间通过监控发现线上的一 些服务存在问题,这个时候需要暂时将这些服务摘掉。有时通过任务系统调用一 些服务,但是,服务依赖的数据库可能存在:网卡打满了、数据库挂掉了或者很多慢查询,此时,需要暂停任务系统让服务方进行处理。

    还有发现突然调用量太大,可能需要改变处理方式(比如同步转换为异步)。此时可以使用开关来完成降级。开关可以存放到配置文件、数据库、Redis/ZooKeeper。如果不是存放在本地,则可以定期同步开关数据(比如1秒同步一 次)。然后,通过判断某个key的值来决定是否降级。

    四、读服务降级

    对于读服务降级一 般采用的策略有:暂时切换读(降级到读缓存、降级到走静态化)、暂时屏蔽读(屏蔽读入口、屏蔽某个读服务)

    页面降级、页面片段降级、页面异步请求降级都是读服务降级,目的是丢卒保帅(比如,因为这些服务也要使用核心资源,或者占了带宽影响到核心服务)

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

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

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

    五、写服务降级

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

    比如扣减库存时的操作,我们都是先扣减缓存中的库存数据,再去扣减数据库的,但是如果是同步的扣减数据库,可能性能会扛不住,因为写入量比较大,此时可以这样降级:

    正常情况下可以同步扣减库存,在性能扛不住时,降级为异步。另外,如果是秒杀场景可以直接降级为异步,从而保护系统。还有,如下单操作可以在大促时暂时降级,将下单数据写入Redis, 然后等峰值过去了再同步回DB.

    适用的情况还有一种,比如一些不是很重要的实时数据,写入量很大时,可以直接降级为异步写入。

    六、多级降级

    降级是离用户越近越对系统保护得好。因为业务的复杂性导致越到后端QPS/TPS越低。什么意思呢?对于用户到服务端到数据持久层来说,浏览器离用户是最近的,离用户越近的时候降级越好。

    可以参考下以下方式:

    • 页面JS降级开关:主要控制页面功能的降级,在页面中,通过JS脚本部署功能降级开关,在适当时机开启/关闭开关。
    • 接入层降级开关:主要控制请求入口的降级,请求进入后,会首先进入接入层,在接入层可以配置功能降级开关,可以根据实际情况进行自动/人工降级。尤其在后端应用服务出问题时,通过接入层降级从而给应用服务有足够的时间恢复服务。
    • 应用层降级开关:主要控制业务的降级,在应用中配置相应的功能开关,根据实际业务情况进行自动/人工降级。

    还有一种层次是在工作流程的每一个流程去控制进行响应的降级:

    优先处理高优先级的数据、只处理某些特征数据、合理分配流量到最需要的场合。

    七、实现

    1. 使用Hystrix实现降级

    2. 使用Hystrix实现熔断

    点击这里

    待续儿。。。

    相关文章

      网友评论

          本文标题:高并发系统开发之降级实战

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