5-高可用-降级

news2024/11/25 0:32:55

在开发高并发系统时,有很多手段来保护系统,如缓存、降级和限流等。

当访问量剧增、服务出现问题(如响应时间长或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。

系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。

降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。降级也需要根据系统的吞吐量、响应时间、可用率等条件进行手工降级或自动降级。

降级预案

在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅,从而梳理出哪些必须誓死保护,哪些可降级。比如,可以参考日志级别设置预案。

  • 一般:比如,有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级。
  • 警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警。
  • 错误:比如,可用率低于90%,或者数据库连接池用完了,或者访问量突然猛增到系统能承受的最大阈值,此时,可以根据情况自动降级或者人工降级。
  • 严重错误:比如,因为特殊原因数据出现错误,此时,需要紧急人工降级。

降级按照是否自动化可分为:自动开关降级和人工开关降级。
降级按照功能可分为:读服务降级和写服务降级。
降级按照处于的系统层次可分为:多级降级。
降级的功能点主要从服务器端链路考虑,即根据用户访问的服务调用链路来梳理哪里需要降级。

  • 页面降级:在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅的目的。
  • 页面片段降级:比如,商品详情页中的商家部分因为数据错误,此时,需要对其进行降级。
  • 页面异步请求降级:比如,商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,则可以进行降级。
  • 服务功能降级:比如,渲染商品详情页时,需要调用一些不太重要的服务(相关分类、热销榜等),而这些服务在异常情况下直接不获取,即降级即可。
  • 读降级:比如,多级缓存模式,如果后端服务有问题,则可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景。
  • 写降级:比如,秒杀抢购,我们可以只进行Cache的更新,然后异步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
  • 爬虫降级:在大促活动时,可以将爬虫流量导向静态页或者返回空数据,从而保护后端稀缺资源。
  • 风控降级:如抢购/秒杀等业务,完全可以识别机器人、用户画像或者根据用户风控级别进行降级处理,直接拒绝高风险用户。

自动开关降级

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

超时降级

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

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

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

在实际场景中一定要配置好超时时间和超时重试次数及机制。

统计失败次数降级

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

故障降级

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

限流降级

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

降级后的处理方案可以是:排队页面(将用户导流到排队页面等一会儿重试)、无货(直接告知用户没货了)、错误页(如活动太火爆了,稍后重试)。

人工开关降级

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

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

另外,对于新开发的服务如果想上线进行灰度测试,但是,不太确定该服务的逻辑是否正确,此时,就需要设置开关,当新服务有问题时可以通过开关切换回老服务。还有多机房服务,如果某个机房挂掉了,则需要将一个机房的服务切到另一个机房,此时,也可以通过开关完成切换。

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

读服务降级

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

读服务,即接入层缓存→应用层本地缓存→分布式缓存→RPC服务/DB

我们会在接入层、应用层设置开关,当分布式缓存、RPC服务/DB有问题时自动降级为不调用。当然,这种情况适用于对读一致性要求不高的场景。
页面降级、页面片段降级、页面异步请求降级都是读服务降级,目的是丢卒保帅(比如,因为这些服务也要使用核心资源,或者占了带宽影响到核心服务),或者因数据问题暂时屏蔽。

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

动态化降级为静态化:比如,平时网站可以走动态化渲染商品详情页,但是,到了大促来临之际可以将其切换为静态化来减少对核心资源的占用,而且可以提升性能。其他还有如列表页、首页、频道页都可以这么处理。

可以通过一个程序定期推送静态页到缓存或者生成到磁盘,出问题时直接切过去。

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

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

写服务降级

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

比如,扣减库存一般这样操作。

  • 方案1:扣减DB库存,扣减成功后,更新Redis中的库存。
  • 方案2:扣减Redis库存,同步扣减DB库存,如果扣减失败,则回滚Redis库存。
  • 方案3:扣减Redis库存,正常同步扣减DB库存,性能扛不住时,降级为发送一条扣减DB库存的消息,然后异步进行DB库存扣减实现最终一致即可。
  • 方案4:扣减Redis库存,正常同步扣减DB库存,性能扛不住时降级为写扣减DB库存消息到本机,然后本机通过异步进行DB库存扣减来实现最终一致性。

前两种方案非常依赖DB,假设此时DB性能跟不上,则扣减库存就会遇到问题。

方案3发送扣减DB库存消息也可能成为瓶颈。

方案4正常情况下可以同步扣减库存,在性能扛不住时,降级为异步

如果是秒杀场景可以直接降级为异步,从而保护系统。

还有,如下单操作可以在大促时暂时降级,将下单数据写入Redis,然后等峰值过去了再同步回DB。

还有如用户评价,如果评价量太大,那么也可以把评价从同步写降级为异步写。当然也可以对评价按钮进行按比例开放(比如,一些人看不到评价操作按钮)。比如,评价成功后会发一些奖励,在必要的时候降级同步到异步。

多级降级

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

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

在下图的订单履约工作流中,整个工作流可以进行多级降级。
在这里插入图片描述

  • 如果恶意订单校验出现不可用的情况,则可以降级,不再同步进行恶意校验,可以直接绕过,也可以改成异步。
  • 如果订单计划出现性能下降,但还可以处理,则在这里优先处理高优级订单、处理逻辑较简单的数据(例单品单件)。
  • 分发订单时,如果仓库负载饱和,则可以降低向京东库房的输送量,增大其他目标地的输送量。

在工作流中的每一个流程中都可以进行相应的降级:优先处理高优先级数据、只处理某些特征的数据、合理分配流量到最需要的场合。

配置中心

我们需要通过配置方式来动态开启/关闭降级开关,在应用时,首先要封装一套应用层API方便业务逻辑使用。

对于开关数据的存储,如果涉及的服务器/系统较少,则初期可以考虑使用配置文件进行配置。

如果涉及的服务器/系统较多,则应该使用配置中心进行配置。实现时要做到不需要修改代码,不需要重启应用即可动态配置开关。

使用配置中心实现开关配置

使用统一配置中心,或者叫分布式配置中心,目的是实现配置开关的集中管理,要有配置后台方便开关的配置,对于一般公司来说配置中心的维护要简单,不需要投入过多的人力来做这件事情。

配置中心不管是采用拉取模式还是推送模式,要考虑到连接数和网络带宽可能带来的风险和问题。

目前有一些开源方案可以选择,如ZooKeeper、Diamond、Disconf、Eted 3、Consul。

本文选择使用Consul,其支持多数据中心、服务发现、KV存储等特性,而且使用简单,提供了简单的Web UI方便管理,更多介绍可以参考Nginx负载均衡部分。我们借助Consul的KV存储特性来实现配置管理。

使用Hystrix实现降级

通过配置中心可以进行人工降级,而我们也需要根据服务的超时时间进行自动降级。

使用Hystrix实现熔断

Hystrix提供了熔断实现,熔断后会自动降级处理。
在这里插入图片描述

  • 闭合(Closed):如果配置了熔断开关强制闭合,或者当前请求失败率没有超过失败率阈值,则熔断开关处于闭合状态,不启动熔断机制,即不进行降级处理。
  • 打开(Open):如果配置了熔断开关强制打开,或者当前失败率超过失败率阈值,则熔断开关打开,启动熔断机制,根据配置调用降级处理方法getFallback进行降级处理。
  • 半打开(Half-Open):当熔断处于打开状态后,不能一直熔断下去,需要在一个时间窗口后进行重试,这种状态就是半打开。Hystrix允许在circuitBreakerSleepWindowInMilliseconds窗口内进行一次重试,重试成功则闭合熔断开关,否则熔断开关还是处于打开状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文解读:On the Integration of Self-Attention and Convolution

自注意力机制与卷积结合:On the Integration of Self-Attention and Convolution(CVPR2022) 引言 1:卷积可以接受比较大的图片的,但自注意力机制如果图片特别大的话,运算规模会特别大,即上图中右边(卷积)会算得比较快…

c语言:求算数平均数|练习题

一、题目 输入3个数&#xff0c;求这三个数的算术平均数 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> #include<math.h> //输入正整数a、b、c的值&#xff0c; //求其算术平均值,并保留两个小数位输出 int pass0;//定义一个开关&#xff0c;…

《JVM由浅入深学习【一】 2023-12-19》JVM由简入深学习提升

JVM由浅入深一&#xff08;类加载&#xff09; JVM的类加载1. java运行时是什么时候被加载的&#xff1f;2. JVM类加载过程大致阶段3. 父类与子类初始化各个类型顺序4. 什么是类加载器&#xff1f;6. 双亲委派机制 JVM的类加载 1. java运行时是什么时候被加载的&#xff1f; …

win10部署安装Elasticsearch8.1.2

环境准备&#xff1a;JDk是1.8以上版本 1、官方下载Elasticsearch部署安装 访问官网,进入主页下载。 2、在下载页面&#xff0c;可以看到选择操作系统&#xff0c;选择系统后点击下载。&#xff08;我这里下载的Windows版本&#xff09; 3下载完成后&#xff0c;解压文件&am…

多级缓存:亿级流量的缓存方案

文章目录 一.多级缓存的引入二.JVM进程缓存三.Lua语法入门四.多级缓存1.OpenResty2.查询Tomcat3.Redis缓存预热4.查询Redis缓存5.Nginx本地缓存6.缓存同步 一.多级缓存的引入 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未…

FA2016ASA (MHz范围晶体单元,内置热敏电阻) 汽车

FA2016ASA是爱普生推出的一款内置热敏电阻、频率范围为38.4MHz的晶振&#xff0c;确保数据的准确传输&#xff0c;同时有效避免频谱干扰的出现。可以在-40C to 125C 的温度内稳定工作。在汽车内部空间有限的情况下&#xff0c;FA2016ASA以其小型超薄的外形尺寸2.0 1.6 0.68mm…

【分享】如何给Excel加密?码住这三种方法!

想要给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff0c;只有输入了正确的密码才能打开并且编辑文件&#xff0c;如果密码错误…

Jenkins 构建环境指南

目录 Delete workspace before build starts&#xff08;常用&#xff09; Use secret text(s) or file(s) &#xff08;常用&#xff09; Add timestamps to the Console Output &#xff08;常用&#xff09; Inspect build log for published build scans Terminate a …

MFC 消息映射机制

目录 消息映射机制概述 宏展开 宏展开的作用 消息映射机制的执行流程 消息处理 消息映射机制概述 MFC的消息映射映射机制是可以在不重写WindowProc虚函数的大前提下&#xff0c;仍然可以处理消息。 类必须具备的要件 类内必须添加声明宏 DECLARE_MESSAGE_MAP() 类外…

【音视频 | AAC】AAC格式音频文件解析

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

33 在Vue3中如何通过插槽向父组件传值

概述 通过插槽向父组件传值&#xff0c;是一种比较高级的&#xff0c;但是非常使用的技术&#xff0c;在很多UI组件库里面经常看到。 这节课我们来学习一下这种用法。 基本用法 我们创建src/components/Demo33.vue&#xff0c;代码如下&#xff1a; <script setup> …

U盘无法读取怎么办?U盘无法读取修复方法

U盘无法读取是常见的故障&#xff0c;可能的原因包括U盘驱动程序未安装、U盘损坏、文件系统损坏等。为了解决这个问题&#xff0c;可以尝试重新安装U盘驱动程序、格式化U盘、检查U盘是否损坏等方法。如果以上方法均无效&#xff0c;建议寻求专业人士的帮助。 U盘无法读取怎么办…

MySQL——基础篇

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1Kr4y1i7ru/?spm_id_from333.999.0.0&vd_source619f8ed6df662d99db4b3673d1d3ddcb 前言✴️ 基础篇——MySQL概述、SQL、函数、约束、多表查询、事务 进阶篇——存储引擎、索引、SQL优化、视图/存储过程/触发…

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列&#xff0c;旨在通过简单标准的性能测试&#xff0c;帮助开发者、企业了解云数据库的性能&#xff0c;以选择适合的规格与类型。这个系列还包括&#xff1a; * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

GitHub two-factor authentication开启教程

问题描述 最近登录GitHub个人页面动不动就有一个提示框”… two-factor authentication will be required for your account starting Jan 4, 2024 …“&#xff0c;点击去看了一下原来是GitHub对所有的用户登录都要开启双重身份认证&#xff0c;要在1月4号前完成 解决办法 …

Jenkins + gitlab 持续集成和持续部署的学习笔记

1. Jenkins 介绍 软件开发生命周期(SLDC, Software Development Life Cycle)&#xff1a;它集合了计划、开发、测试、部署的集合。 软件开发瀑布模型 软件的敏捷开发 1.1 持续集成 持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。 持续集成的流…

清风数学建模学习笔记-斯皮尔曼相关系数

内容&#xff1a;斯皮尔曼相关系数 一.原理&#xff1a; 二.算法&#xff1a; 1.MATLAB: 2.SPSS&#xff1a; 分析-相关-双变量相关-勾选标注显著性相关性 3. 相关性系数的选择&#xff1a;

三大主流前端框架介绍及选型

在前端项目中&#xff0c;可以借助某些框架&#xff08;如React、Vue、Angular等&#xff09;来实现组件化开发&#xff0c;使代码更容易复用。此时&#xff0c;一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成&#xff0c;而是按照组件的思想将网页划分成一个个组…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -SpringMVC搭建框架

第一章 初识SpringMVC 1.1 SpringMVC概述 SpringMVC是Spring子框架 SpringMVC是Spring 为**【展现层|表示层|表述层|控制层】**提供的基于 MVC 设计理念的优秀的 Web 框架&#xff0c;是目前最主流的MVC 框架。 SpringMVC是非侵入式&#xff1a;可以使用注解让普通java对象&…

自动化测试|Eolink Apikit 如何保存、使用测试用例

测试用例是测试过程中很重要的一类文档&#xff0c;它是测试工作的核心&#xff0c;是一组在测试时输入和输出的标准&#xff0c;是软件需求的具体对照。 测试用例可以帮助测试人员理清测试思路&#xff0c;确保测试覆盖率&#xff0c;发现需求漏洞&#xff0c;提高软件质量&a…