一文搞懂微服务架构之降级

前置知识

比如双十一之类的大促高峰,平台是会关闭一些服务的,比如退款服务。这就是降级的典型应用,不过它是一种手动的跨服务降级,对于整个系统来说,提供了一部分服务,但是没有提供另外一部分服务,在整个系统层面上是降级的。
好处有两个,一方面是腾出了服务器资源,可以给订单服务或支付服务;另外一方面是减少了对公共组件的压力,比如减少了对数据库的写入压力。
在这里插入图片描述
如果仅仅是针对退款服务而言,也可以认为是退款服务整个熔断了

降级与熔断

降级有熔断非常像,两个关键点

  • 如何判定服务健康,在降级中是判断一个服务要不要降级
  • 降级之后怎么恢复,也是要考虑抖动的问题

在一些场景下,既可以用熔断,也可以用降级。比如响应时间超出阈值之后,可以选择熔断,完全不提供服务;也可以考虑降级,提供有损服务。
原则上来说,应该优先使用降级。但是有些服务无法降级,尤其是写服务。例如你要从前端接收数据,然后写到数据库,这种场景是无法降级的。另外,如果你希望系统负载尽快降低,那么熔断要优于降级
在这里插入图片描述

如何降级

  • 跨服务降级:资源不够的时候可以暂停某些服务,将腾出来的资源给其他更加重要、更加核心的服务使用。
  • 本服务提供有损服务:例如APP首页都会有降级策略,在没有触发降级的时候,APP首页是针对个人画像的个性化推荐。而触发降级之后,则可能是使用榜单数据,或是运营提前配置好的静态页面。要点是要知道服务调用者能够接受什么程度的有损
    在这里插入图片描述
    跨服务降级的措施常见的有三个:
  • 整个服务停掉,例如前面提到的停掉退款服务
  • 停掉服务的部分节点
  • 停止访问某些资源。例如日志中心压力很大的时候,发信号给某些不重要的服务,让他们停止上传日志,只在本地保存日志
    在这里插入图片描述
    而对服务本身,也有一些常见的降级思路
  • 返回默认值,这算是一种简单的情况
  • 禁用可观测性组件,正常来说业务里充满了各种各样的埋点,这些埋点本身是会带来消耗的,性能瓶颈的时候可以考虑停用,或是降低采样率
  • 同步转异步,即正常情况下,服务收到请求后会立马处理。但是在降级的情况下,服务收到一个请求之后只会返回一个代表已接收的响应。后续服务会异步开启线程处理,或是定时任务处理
  • 简化流程:如果你处理一个请求需要很多步骤,后续如果有一些步骤不关键的话,可以考虑不执行,或者异步执行。例如在内容生产平台,一般新内容要被推送到推荐系统里面。那么在降级的情况下你可以不推,而后可以考虑异步推送过去,也可以考虑等系统恢复之后再推送过去
    在这里插入图片描述

面试准备

使用降级的情况

  • 网站、APP之类的产品,在首页、核心页面有没有采取降级措施。如果采用了降级,降级前后的逻辑是什么样的
  • 有没有使用降级来保护系统,如果有,需要了解清楚什么情况下会触发降级,降级前后的逻辑,怎么从降级中恢复过来

最佳面试策略是把降级作为构建高可用微服务架构的一个措施

A系统是我们公司的核心系统,主要职责是保障该系统的高可用,为了达到这个目标,合理运用了熔断、降级、隔离等措施

常见问题:

  • 是否了解服务治理
  • 如何提高系统可用性
  • 如果系统负载高怎么办
  • 依赖的下游服务或下游中间件崩溃了怎么办

同时为了展示亮点,需要记住后面给出的两个方案:读写服务降级写服务和快慢路径降级慢路径。非常建议参考这两个方案的思路,基于自己的实际业务情况设计自己独有的降级面试案例

基本思路

可以先介绍降级的基本概念,比如前面的大促和APP首页的例子。如果之前和面试官没有聊过熔断,可以在这里补充熔断里面讨论判断服务健康的要点,结合自己公司内部使用降级的例子,或是不是自己亲手落地但是自己也了解详情的案例。

我在公司也用了降级来保护我维护的服务。举例来说,正常情况下我的服务都会全量采集各种监控指标。那么在系统触及性能瓶颈的时候,我就会调整采集的比率。甚至在关键的时候,我会直接停用掉所有的指标采集,将资源集中在提供服务上。

讲完一个案例后,可以进一步总结常规的降级思路。

如果不了解细节的话,可以大方承认这就是听说过的措施,并没有实际落地。

最关键的问题就是抖动,可以将熔断与降级结合,总结升华一下。

总的来说,在任何的故障处理里面,都要考虑恢复策略会不会引起抖动问题

读写服务降级写服务

如果某个服务里同时提供了读服务和写服务,并且读服务明显比写服务更重要,这时候降级写服务
假如我有一个针对商家的服务,商家调用这些 API 来录入一些数据,比如他们门店的基本信息,上传一些门店图片等。同时我还有一个针对 C 端普通用户的服务,这个服务就是把商家录入的数据展示在商家门店的首页上。所以你可以看到在这个场景下,读服务 QPS 更高,也更加重要
那么如果这两个服务是一起部署的,在需要降级的时候,就可以考虑将针对商家的写服务停掉,将资源都腾出来给针对 C 端用户的读服务。所以你可以介绍这个方案,关键词是降级写服务

我在公司维护了一个服务,它的接口可以分成两类:一类是给 B 端商家使用的录入数据的接口,另外一类是给 C 端用户展示这些录入的数据。所以从重要性上来说,读服务要比写服务重要得多,而且读服务也是一个高并发的服务
于是我接入了一个b。当我发现读服务的响应时间超过了阈值的时候,或者响应时间开始显著上升的时候,我就会将针对 B 端商家用户的服务临时停掉,腾出来的资源都给 C 端用户使用。对于 B 端用户来说,他们这个阶段是没有办法修改已经录入的数据的。但是这并不是一个特别大的问题。当 C 端接口的响应时间恢复正常之后,会自动恢复 B 端商家接口,商家又可以修改或者录入数据了。

同时可以从数据库性能影响的角度来进一步解释降级写服务的优点

虽然整体来说写服务 QPS 占比很低,但是对于数据库来说,一次写请求对性能的压力要远比一次读请求大。所以暂停了写服务之后,数据库的负载能够减轻不少。


除了这种 B 端录入 C 端查询的场景,还有很多类似的场景也适用。

  • 内容生产平台,作者生产内容,C 端用户查看生产的内容。那么在资源不足的情况下可以考虑停掉内容生产端的服务,只保留 C 端用户查看内容的功能。
  • 如果你的用户分成普通用户和 VIP 用户,那么你也可以考虑停掉给普通用户的服务。甚至,如果一个服务既提供给普通用户,也提供给 VIP 用户,你可以考虑将普通用户请求拒绝掉,只服务 VIP 用户。

总结

这个方案就是典型的跨服务降级。跨服务降级可以在大部分合并部署的服务里面使用,一般的原则就是 B、C 端合并部署降级 B 端;付费服务和非付费服务降级非付费服务。当然也可以根据自己的业务价值,将这些部署在同一个节点上的服务分成三六九等。而后在触发降级的时候从不重要的服务开始降级,将资源调配给重要服务。

在这里插入图片描述
可能会问怎么确定一个服务的业务价值,又或者你可以自己引出这个话题,关键词就是赚钱

判断一个服务的业务价值最简单的方法就是问产品经理,产品经理自然是清楚什么东西带来了多少业务价值。又或者根据公司的主要营收来源确定服务的业务价值,越是能赚钱的就越重要。唯一的例外是跟合规相关的。比如说内容审核,它不仅不赚钱,还是一块巨大的成本支出。但是不管怎么降级,内容审核是绝对不敢降级的,不然就等着被请去喝茶交代问题吧。

这里我们还可以进一步展示亮点,让人感觉你对微服务框架有很深研究。关键词就是跨节点。

不过这种跨服务降级都是只能降级处在同一个节点的不同服务。而如果服务本身就分布在不同节点上的话,是比较难设计这种降级方案的。比如说大促时关闭退款服务这种,就需要人手工介入。 从理论上来说,网关其实是可以考虑支持这种跨节点的服务降级的。假如说我们有 A、B 两个服务,A 比 B 更加有业务价值。那么在 A 服务所需资源不足的时候,网关可以考虑停掉 B 的一部分节点,而后在这些节点上部署 A 服务。对于 B 服务来说,它只剩下一部分节点,所以也算是被降级了。很可惜,大部分网关的降级设计都没考虑过这种跨服务降级的功能。 微服务框架做得就更差了。大部分微服务框架提供的降级功能都是针对本服务的,比如说在触发降级的时候返回一个默认值。

在这里插入图片描述
最后对网关的评价可能会让面试官将话题引向网关,所以你要在对面试网关内容有把握的情况下再说。

快慢路径降级慢路径

熔断里有一个例子,即如果Redis崩溃了,可以直接触发熔断。这种做法是为了保护数据库,防止把数据库打挂。

也可以使用降级来保护这个缓存 - 数据库结构。正常来说,使用缓存基本都是先从缓存里读数据,然后缓存里没有数据,再从数据库中读取。
在触发降级的情况下,可以考虑只从缓存里读取。如果缓存里没有,也不会再去数据库读取。这样可以保证缓存里有数据的请求可以得到正常处理,也就是提供了有损服务。

在这里插入图片描述
这种降级方案背后的逻辑也很简单**。如果完全不考虑从数据库里取数据,那么你的性能瓶颈就完全取决于缓存或者说 Redis,那么服务能够撑住的 QPS 会非常高**。但是,如果缓存不命中的时候要去数据库取数据,那么服务的性能会衰退得非常快,即极少数缓存未命中的请求会占据大部分的系统资源。

在这里插入图片描述
你可以这样回答,关键词是只查缓存

我还用过另外一个降级方案。正常来说在我的业务里面,就是查询缓存,如果缓存有数据,那么就直接返回。如果缓存没有,那么就需要去数据库查询。如果此时系统的并发非常高,那么我就会采取降级策略,将请求标记为降级请求。降级请求只会查询缓存,而不会查询数据库。如果缓存没有,那就直接返回错误。这样能够有效防止因为少部分请求缓存未命中而占据大量系统资源,导致系统吞吐量下降和响应时间显著升高。

同样地,你也需要总结拔高一下,关键词是快慢路径。

这种思路其实可以在很多微服务里面应用。如果一个服务可以分成快路径和慢路径两种逻辑,那么在降级之前就可以先走快路径,再走慢路径。而触发了降级之后,就只允许走快路径。在前面的例子里面,从缓存里加载数据就是快路径,从数据库里面加载数据就是慢路径。 慢路径还可以是发起服务调用或者复杂计算。比如说一个服务快路径是直接查询缓存,而慢路径可能是发起很多微服务调用,拿到所有响应之后一起计算,算出来一个结果并缓存起来。那么在降级的时候,可以有效提高吞吐量。不过这种吞吐量是有损的,毕竟部分请求如果没有在缓存中找到数据,那么就会直接返回失败响应。

在这里插入图片描述
很自然地,你的关键服务都应该有类似的降级措施。当任何下游崩溃,或者第三方中间件崩溃,你都可以不再调用这些崩溃的下游服务或中间件,以确保提供有损服务
如果你选择这个作为亮点方案的话,那么自然就可以将话题引导到缓存的使用上来,你就可以使用课程后面缓存相关的内容来阐述了。

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

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

相关文章

InternLM2_PracticalCamp_L2_task3_LMDeploy量化部署进阶实践

1 配置LMDeploy环境 1.1 InternStudio开发机创建与环境搭建 点选开发机,自拟一个开发机名称,选择Cuda12.2-conda镜像。 我们要运行参数量为7B的InternLM2.5,由InternLM2.5的码仓查询InternLM2.5-7b-chat的config.json文件可知,…

数据库多表设计:深入理解一对多、一对一、多对多关系 【后端 12】

数据库多表设计:深入理解一对多、一对一、多对多关系 在数据库设计中,表之间的关系决定了如何组织和存储数据。常见的表关系包括一对多、一对一和多对多。在不同的业务场景下,我们会选择不同的关系模式进行数据库设计。本文将通过具体案例介绍…

企业高性能web服务器

目录 一、web服务介绍 1.1 Web 服务访问流程 1.2 Web 服务器类型 1.3 Apache常用工作模式 1.3.1 Apache prefork 模型 1.3.2 Apache worker 模型 1.3.3 Apache event 模型 【补充】 子进程角色主要负责以下: 二、Nginx 架构和安装 2.1 Nginx 编译安装示例…

Maven的依赖范围

依赖的jar包,默认情况下,可以在任何地方使用,可以通过scope来设置作用范围 作用范围: 主程序范围有效(main文件夹范围内)测试程序范围有效(test文件夹范围内)是否参与打包运行&…

投资伦敦银一般看什么点位做单?

伦敦银的价格走势不断变化,无论投资者选择做多还是做空,进场的点位都不是一成不变的, 如果投资者想找到胜率比较高的进场点位,可以尝试在走势图中找出银价的支撑与压力位所在,然后在压力位附近布局空单,在…

fastadmin 安装

环境要求,大家可以参考官方文档的,我这里使用的是phpstudy,很多已经集成了。 注意一点,PHP 版本:PHP 7.4 。 第二步:下载 下载地址:https://www.fastadmin.net/download.html 进入下载地址后…

SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)

Spring Boot 项目中使用 Spring Data Redis 实现地理坐标(Geospatial) 概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Sup…

如何制作统信UOS启动盘?

如何制作统信UOS启动盘? 一、下载UOS系统安装镜像二、在UOS系统环境下制作启动盘步骤一:准备U盘步骤二:打开启动盘制作工具步骤三:选择ISO镜像文件步骤四:选择安装介质并格式化步骤五:等待制作完成 三、在W…

Redis 技术详解

一、Redis 基础 (一)为什么使用 Redis 速度快,因为数据存在内存中,类似于 HashMap,查找和操作的时间复杂度都是 O(1)。支持丰富数据类型,支持 string、list、set、Zset、hash 等。支持事务,操…

AScript 的UI asui模板的导入

两种方案: 第一种直接在web端,右击UI文件夹 第二种在pycharm,也是右击UI文件夹 调用UI,在init类中直接调用即可

Transformer微调实战:通过低秩分解(LoRA)对T5模型进行微调(LoRA Fine Tune)

scient scient一个用python实现科学计算相关算法的包,包括自然语言、图像、神经网络、优化算法、机器学习、图计算等模块。 scient源码和编译安装包可以在Python package index获取。 The source code and binary installers for the latest released version ar…

Aria2安装和使用-Mac版

起因是需要网盘下载,无奈限速很烦,查找很多方案后,最终决定使用Aria2 Tampermonkey。 其中Aria2是一款开源轻量的下载软件,简单来说就是可以通过URL直接下载。 Tampermonkey则是一款插件,我这里是.crx结尾的谷歌插件…

文件IO函数:open/close,read/write,lseek

open和close函数 C语言中的文件IO操作需要使用到open()函数和close()函数来打开和关闭文件。 open()函数的原型如下: int open(const char *pathname, int flags); int open(const char *filename, int flags,mode_t mode);其中,filename表示要打开…

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存(RAM)都是有限的,而我们的应用程序需要加载到内存才能被运行,如果一台机器运行多个应用程序时,内存可能会耗尽。Linux 系统中的“交换空间(也称为交换分区)”可以帮助缓…

Google Play开发者账号地址验证难题?这些经验或许能帮到你

目前,想要把应用顺利上架到 Google Play,已经不像以前那么简单了,主要是开发者需要应对 Google 日益严格的审核机制。其中,账号验证的地址验证绝对是让很多人头疼的一个环节。 今天就来给大家分享一些真实的经验和干货&#xff0c…

IA实验:静态路由(1基础版)

实验拓扑: 实验要求: 1.实现全网通 实验思路: 1.给各个设备配置好端口的IP地址并且划分广播域,暂定网段为: 192.168.1.0 192.168.2.0 192.168.3.0 2.pc1去ping各网段的设备以及端口,发现3.0网段以及2.2网…

数控单主轴走心机多少钱

单主轴走心机的价格因品牌、型号、性能及配置等因素而异,因此无法给出一个具体的统一价格。一般来说,单主轴走心机的价格在数万元到数十万元不等。 市场上某些品牌的单主轴走心机价格可能在十几万之间不等,而另一些高端型号或定制产品的价格可…

苹果上架没有iphone、没有ipad也可以生成截屏

使用flutter、uniapp或其他跨平台框架开发ios的APP,上架的时候都会遇到一个问题,上架的时候需要各种尺寸的设备来做ios截屏。 比如目前最新的要求是,iphone需要三种不同尺寸的设备的截屏,假如支持ipad则还需要使用ipad 2代和ipad…

从0开始搭建个人博客《第十一期:优化网站访问速度》

目录 一、背景说明 二、Nginx性能优化 (一)文件句柄 1.系统全局性修改和用户局部性修改 2.进程局部性修改 (二)CPU亲和配置 1.设置工作进程数 2.设置连接数 (三)事件处理模型优化 (四&…

MySql 高阶 概念(了解即可)

mysql 分为4层结构: 连接层:负责处理链接,鉴权,安全。 服务层:负责sql接口,sql分析,sql优化,sql缓存。 引擎层:负责执行服务层的操作,不同的引擎拥有不同的特…