系统降级-接口级别

article/2025/8/28 0:19:21

导致接口级故障的原因

内部原因

  • 程序bug导致死循环
  • 某个接口导致数据库慢查询
  • 程序逻辑不完善导致耗尽内存等

外部原因

  • 黑客攻击、促销或者抢购引入了超出平时几倍甚至几十倍的用户
  • 第三方系统大量请求
  • 第三方系统响应缓慢等

解决接口故障的核心思想

  • 优先保证核心业务和优先保证绝大部分用户
  • 丢车保帅,优先保证核心业务

降级

降级指系统将某些业务或者接口的功能降低,可以是只提供部分功能,也可以是完全停掉所有功能

案例

  • 双11,订单暂时不允许修改收货地址
  • 论坛,降级为只能看帖子,不能发帖子
  • App的日志上传接口,可以完全停掉一段时间,这段时间内APP都不能上传日志

常见的实现降级的方式有

系统后门降级

例如,系统提供一个降级URL,当访问这个URL时,就相当于执行降级指令,具体的降级指令通过URL的参数传入即可
缺点:安全隐患,服务器数量多,需要一台一台去操作

独立降级系统

将降级操作独立到一个单独的系统中,可以实现复杂的权限管理、批量操作等功能。其基本架构如下:
  在这里插入图片描述熔断

降级的目的是应对系统自身的故障,而熔断的目的是应对依赖的外部系统故障的情况

案例

  • A服务的X功能依赖B服务的某个接口,当B服务的接口响应很慢的时候,A服务的X功能响应肯定被拖慢,进一步导致A服务的线程都被卡在X功能处理上,此时A服务的其他功能都会被卡住或者响应非常慢
  • 加入熔断机制后,A服务不再请求B服务这个接口,A服务内部只要发现是请求B服务的这个接口就立即返回错误,从而避免A服务整个被拖慢甚至拖死

实现

  • 关键是需要有一个统一的API调用层,由API调用层来进行采样或者统计,如果接口调用散落在代码各处就没法进行统一处理了
  • 另一个关键是阈值的设计,例如1分钟内30%的请求响应时间超过1秒就熔断,这个策略的“1分钟”“30%”“1秒”都对最终的熔断效果有影响
  • 实践中一般都是先根据分析再确定阈值,然后上线观察效果,再进行调优

限流

降级是从系统功能优先级的角度考虑如何应对故障,而限流则是从用户访问压力的角度来考虑如何应对故障
限流指只允许系统能够承受的流量进来,超出系统访问能力的请求将被丢弃

常见的限流方式

基于请求限流
是指从外部访问的请求角度考虑限流
  
常见方式:限制总量、限制时间量
  限制总量:限制某个指标的累积上限
  例如,某个直播间限制总用户数上限为100万,超过后无法进入;抢购活动商品数量100个,限制参与用户1万个,超过1万个后直接拒绝
  限制时间量:限制一段时间内某个指标的上限
  例如,1分钟内只允许10000个用户访问,每秒请求峰值最高为10万
  缺点:阈值难于确定

基于资源限流
是指从系统内部考虑的,找到系统内部影响性能的关键资源,对其使用上限进行限制

常见的内部资源:连接数、文件句柄、线程数、请求队列等
例如,采用Netty来实现服务器,每个进来的请求都先放入一个队列,业务线程再从队列读取请求进行处理,队列长度最大值为10000,队列满了就拒绝后面的请求;也可以根据CPU的负载或者占用率进行限流,当CPU的占用率超过80%的时候就开始拒绝新的请求

缺点:难于确定关键资源及其阈值
实现方案:逐步调优,开始时先根据推断选择某个关键资源和阈值,然后测试验证,再上线观察,不合理再优化。

排队

  • 排队是限流的一个变种,限流是直接拒绝用户,排队是让用户等待一段时间
  • 由于排队需要临时缓存大量的业务请求,单个系统内部无法缓存这么多数据,一般情况下,排队需要用独立的系统去实现,例如使用Kafka这类消息队列来缓存用户请求

在这里插入图片描述
排队模块

将请求以先入先出的方式保存下来,每一个参加秒杀的商品保存一个队列

调度模块

负责排队模块到服务模块的动态调度,不断检查服务模块,一旦处理能力有空闲,就从排队队列头上把用户访问资源请求调入服务模块,并负责向服务模块分发请求

服务模块

负责调用真正业务来处理服务,并返回处理结果,调用排队模块的接口回写业务处理结果

转载自:https://juejin.im/post/5cb6b410e51d456e2809fb89


http://chatgpt.dhexx.cn/article/LJZ4QtVn.shtml

相关文章

Dubbo服务降级

dubbo降级服务 使用dubbo在进行服务调用时,可能由于各种原因(服务器宕机/网络超时/并发数太高等),调用中就会出现RpcException,调用失败。 服务降级就是指在由于非业务异常导致的服务不可用时(上面举得例…

降级限流

目录 1、限流和降级 1.1、降级 1.2、限流 2、限流算法 2.1、滑动窗口 2.2、漏桶 2.3、令牌桶 3、限流实践 3.1、单机Guava实现令牌桶和漏桶 3.2、分布式限流器实现 3.2.1、Redis实现 3.2.2、lua脚本实现 3.2.3、Redission的实现 4、小结 前言 对于高可用的服务,除了…

服务降级设计

实际系统运维中会出现某点的流量高峰,该时间有些可以预计,如双十一,有些不能预计,如某明星大爆料 等等,那么对着此类情况加设备等不能满足要求或者不能立刻满足邀请的时候,就需要对服务进行降级操作。

mysql数据库自动降级_mysql降级caveats

在线QQ客服:1922638 专业的SQL Server、MySQL数据库同步软件 在此博客中,我们将讨论在MySQL降级期间需要注意的事项。 之前,我曾写过博客MySQL升级最佳实践。除了升级MySQL版本外,有时还需要降级。在降级MySQL时,支持两种降级方法: 就地降级:在这种方法中,您使用现有的数…

Dubbo使用之服务降级

什么是服务降级 降级的目的是为了保证核心服务可用。 降级可以有几个层面的分类: 自动降级和人工降级; 按照功能可以分为:读服务降级和写服务降级 对一些非核心服务进行人工降级,在大促之前通过降级开关关闭哪些推荐内容、评价…

伪代码格式和标准

目录 注意算法组成部分算法示例 注意 每一条指令占一行(else if例外),指令后不跟任何符号(Pascal和C中语句要以分号结尾)每一行要标号开头描述输入,输出变量名和保留字不区分大小写,Pascal相同,C或C不同数…

LaTeX伪代码写法总结

1. 伪代码所用包 一般会接触到的包有algorithm、algorithmic、algorithmicx、algorithm2e这四种包。 algorithm用于给伪代码提供一个浮动体环境,防止其换页或其他因素导致的内容中断,从而跨页显示。 algorithmic用于编辑伪代码的内容,一些…

伪码-伪代码的定义以及实现

伪代码的写法 伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言…

伪代码教程

伪代码教程 起一篇伪代码基础教程 伪代码(Pseudo code)是一种介于计算机语言和自然语言间的文字和符号,是表达算法的简单而有效的方法。伪代码不需要关注底层是如何实现的,本身就是算法框架的逻辑模型。 一、赋值语句 赋值号 A ← B A\leftarrow B A←…

伪代码怎么编写?

20230522 补充一下: 建议学习PUML的语法,这个和伪代码很相似,也可以看到业务流程图 问 根据IDEA项目代码生成伪代码的工具 答 目前没有根据IDEA项目代码自动生成伪代码的工具。伪代码是一种描述程序算法的语言,通常不是具体的编…

【笔记】伪代码编写

在线LaTeX编写工具overleaf极大的方便了暂时需要为论文编写伪代码的需要:Overleaf, Online LaTeX Editor 该工具只需要简单注册就可以使用。 首先进入overleaf主页,然后完成注册和登录: 接着,需要创建用于储存LaTeX的文件夹&…

伪代码与代码区别

伪码(Pseudocode)是一种算法描述语言。使用伪码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似…

伪代码书写方式

伪代码是描述算法过程的一种语言,它可以直接用中文或者英文等自然语言表示,也可以直接上代码,但常用经典的语法表示(讲的就是这种)。日常生中,别人能通过你的描述明白相应算法就行。 小规范 1、不需要声明变量,变量名可以一定程…

伪代码学习与应用

目录 0. 前言1. 伪代码的基础语法2. 在word中插入伪代码2.1 Aurora和Miktex安装2.2 插入伪代码 参考链接伪代码模板模板一模板二模板三模板四 疑难杂症1. 显示中文?2. 特殊字符?3. 换行? 0. 前言 上一次接触伪代码可能还是在现代数字信号处理…

2D激光slam四种算法建图效果对比

slam算法对照 通过麦克纳姆轮机器人小车构建地图对比Gmapping、Hector、Karto、Cartographer四种算法的优缺点 真实场景图如下图所示: 具体步骤为: 1、打开地图构建命令 roslaunch turn_on_wheeltec_robot mapping.launch2、打开rviz rviz3、打开控制…

SLAM——hector-slam算法原理解析

1、hector-slam代码框架概述 下载源码:git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git 原理解读参照:https://blog.csdn.net/weixin_40047925/article/details/80679496 其中包含了许多用于仿真的文件,hector slam算法主…

激光SLAM算法学习(三)——3D激光SLAM

3D激光SLAM 1、3D激光SLAM的介绍 3D激光SLAM的输入: IMU数据 3D激光雷达数据 里程计数据 3D激光SLAM的输出: 3D点云地图 机器人的轨迹 or PoseGraph 2、3D激光SLAM的发展 3D激光SLAM的帧间匹配方法——点云配准算法 Point-to-Plane ICP Feature-based Method 3D激光SLAM的回…

SLAM 算法的一些简单的介绍和理解,有的是从别的地方找到的资料,感觉很有道理。

SLAM(Simultaneous localization and mapping),我们要达到的目的就是估计机器人(传感器-比如相机)的位置轨迹,然后创建地图。locating和map两者互相依赖,密不可分。然而我们 已知的信息一个是 observation&…

2021年开源SLAM算法

1.TANDEM:Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo 慕尼黑工业大学Daniel Cremers团队,实时单目跟踪稠密建图纯视觉SLAM,采用Realsense D455(深度传感器IMU,但只用RGB) 项目地址:https…

激光SLAM技术总结(3)3D激光SLAM算法原理

目录 1. 3D激光SLAM简介 2. 3D激光雷达SLAM 3. 高精度V-LOAM方案 4 发展趋势 1. 3D激光SLAM简介 在 3D 激光 SLAM 领域中, 由 Zhang J 等人提出的LOAM 方案,利用 3D 激光雷达采集数据, 进行基于特征点的扫描匹配, 利用非线性…