【原创】谈谈服务雪崩、降级与熔断

2023-11-13

引言

首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文。当然,考虑到目前大多微服务的文章都是口水文,烟哥争取将实现方式讲透,点清楚,让大家有所收获!
OK,我要先说明一下,我有很长一段时间将服务降级服务熔断混在一起,认为是一回事!
为什么我会有这样的误解呢?
针对下面的情形,如图所示
725429-20190130225813653-676264554.png
Service A调用Service B,失败多次达到一定阀值,Service A不会再去调Service B,而会去执行本地的降级方法!
对于这么一套机制:在Spring cloud中结合Hystrix,将其称为熔断降级!

所以我当时就以为是一回事了,毕竟熔断和降级是一起发生的,而且这二者的概念太相近了!后面接触了多了,发现自己理解的还是太狭隘了,因此本文中带着点我自己的见解,大家如果有不同意见,请轻喷!毕竟还有很多人认为两者是一致的!

正文

服务雪崩

OK,我们从服务雪崩开始讲起!假设存在如下调用链
725429-20190130225819816-259073605.png

而此时,Service A的流量波动很大,流量经常会突然性增加!那么在这种情况下,就算Service A能扛得住请求,Service BService C未必能扛得住这突发的请求。
此时,如果Service C因为抗不住请求,变得不可用。那么Service B的请求也会阻塞,慢慢耗尽Service B的线程资源,Service B就会变得不可用。紧接着,Service A也会不可用,这一过程如下图所示
725429-20190130225824355-156743654.jpg

如上图所示,一个服务失败,导致整条链路的服务都失败的情形,我们称之为服务雪崩。

ps:谁发明的这个词,真是面试装13必备!

那么,服务熔断和服务降级就可以视为解决服务雪崩的手段之一。

服务熔断

那么,什么是服务熔断呢?
服务熔断:当下游的服务因为某种原因突然变得不可用响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
需要说明的是熔断其实是一个框架级的处理,那么这套熔断机制的设计,基本上业内用的是断路器模式,如Martin Fowler提供的状态转换图如下所示
725429-20190130230717121-435467568.jpg

  • 最开始处于closed状态,一旦检测到错误到达一定阈值,便转为open状态;
  • 这时候会有个 reset timeout,到了这个时间了,会转移到half open状态;
  • 尝试放行一部分请求到后端,一旦检测成功便回归到closed状态,即恢复服务;

业内目前流行的熔断器很多,例如阿里出的Sentinel,以及最多人使用的Hystrix
在Hystrix中,对应配置如下

//滑动窗口的大小,默认为20
circuitBreaker.requestVolumeThreshold 
//过多长时间,熔断器再次检测是否开启,默认为5000,即5s钟
circuitBreaker.sleepWindowInMilliseconds 
//错误率,默认50%
circuitBreaker.errorThresholdPercentage

每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。

这些属于框架层级的实现,我们只要实现对应接口就好!

服务降级

那么,什么是服务降级呢?
这里有两种场景:

  • 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度!
  • 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!

其实乍看之下,很多人还是不懂熔断和降级的区别!

其实应该要这么理解:

  • 服务降级有很多种降级方式!如开关降级、限流降级、熔断降级!
  • 服务熔断属于降级方式的一种!

可能有的人不服,觉得熔断是熔断、降级是降级,分明是两回事啊!其实不然,因为从实现上来说,熔断和降级必定是一起出现。因为当发生下游服务不可用的情况,这个时候为了对最终用户负责,就需要进入上游的降级逻辑了。因此,将熔断降级视为降级方式的一种,也是可以说的通的!

我撇开框架,以最简单的代码来说明!上游代码如下

try{
    //调用下游的helloWorld服务
    xxRpc.helloWorld();
}catch(Exception e){
    //因为熔断,所以调不通
    doSomething();
}

注意看,下游的helloWorld服务因为熔断而调不通。此时上游服务就会进入catch里头的代码块,那么catch里头执行的逻辑,你就可以理解为降级逻辑!
什么,你跟我说你不捕捉异常,直接丢页面?
OK,那我甘拜下风,当我理解错误!

服务降级大多是属于一种业务级别的处理。当然,我这里要讲的是另一种降级方式,也就是开关降级!这也是我们生产上常用的另一种降级方式!

做法很简单,做个开关,然后将开关放配置中心!在配置中心更改开关,决定哪些服务进行降级。至于配置变动后,应用怎么监控到配置发生了变动,这就不是本文该讨论的范围。
那么,在应用程序中部下开关的这个过程,业内也有一个名词,称为埋点

那接下来最关键的一个问题,哪些业务需要埋点?
一般有以下方法
(1)简化执行流程
自己梳理出核心业务流程和非核心业务流程。然后在非核心业务流程上加上开关,一旦发现系统扛不住,关掉开关,结束这些次要流程。

(2)关闭次要功能
一个微服务下肯定有很多功能,那自己区分出主要功能和次要功能。然后次要功能加上开关,需要降级的时候,把次要功能关了吧!

(3)降低一致性
假设,你在业务上发现执行流程没法简化了,愁啊!也没啥次要功能可以关了,桑心啊!那只能降低一致性了,即将核心业务流程的同步改异步,将强一致性改最终一致性!

可是这些都是手动降级,有办法自动降级么?
这里我摸着良心说,我们在生产上没弄自动降级!因为一般需要降级的场景,都是可以预见的,例如某某活动。假设,平时真的有突发事件,流量异常,也有监控系统发邮件通知,提醒我们去降级!
当然,这并不代表自动降级不能做,因此以下内容可以认为我在胡说八道,因为我在生产上没实践过,只是头脑大概想了下,如果让我来做自动降级我会怎么实现:

  • (1)自己设一个阈值,例如几秒内失败多少次,就启动降级
  • (2)自己做接口监控(有兴趣的可以了解一下Rxjava),达到阈值就走推送逻辑。怎么推呢?比如你配置是放在git上,就用jgit去改配置中心的配置。如果配置放数据库,就用jdbc去改。
  • (3)改完配置中心的配置后,应用就可以自动检测到配置的变化,进行降级!(这句不了解的,了解一下配置中心的热刷新功能)

转载于:https://www.cnblogs.com/rjzheng/p/10340176.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【原创】谈谈服务雪崩、降级与熔断 的相关文章

随机推荐

  • Python开发是面向过程、函数还是对象?

    面向过程和面向对象是一种编程思想 那么Python开发是面向过程 面向函数还是面向对象呢 这里小编告诉大家 Python既支持面向对象 也支持面向过程 尽管 Python 是一种解释型语言 但它从一开始就是一种面向对象的语言 在 Pytho
  • 剑指offer 学习笔记 复杂链表的复制

    分治法 把分解后的小问题各个解决 然后把小问题的解决方案结合起来解决大问题 面试题35 复杂链表的复制 请实现函数ComplexListNode Clone ComplexListNode pHead 复制一个复杂链表 在复杂链表中 每个节
  • java相关知识

    spring 一个轻量级的控制反转和面向切面的容器 专业的开发Web项目的开源框架 spring mvc 是基于spring的mvc框架 属于一个企业WEB开发的MVC框架 涵盖面包括前端视图开发 文件配置 后台接口逻辑开发等 spring
  • 【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建Java、Python项目

    文章目录 一 云IDE 1 云IDE简介 2 云IDE和云虚拟桌面区别 二 Cloud Studio 简介 1 简介 2 AI代码助手 3 企业源代码安全 三 快速开始 1 登录Cloud Studio 2 新建工作空间 3 代码空间 四
  • 软件开发的功能性需求和非功能性需求

    作者 天光 链接 https www zhihu com question 20303645 answer 15588211 来源 知乎 著作权归作者所有 转载请联系作者获得授权 功能性需求 一般是我们显性易见的 就是一般实现了什么功能 提
  • 关于AR眼镜的小结

    根据IDC International Data Corporation 国际数据公司 IDC是全球著名的信息技术 电信行业和消费科技咨询 顾问和活动服务专业提供商 的报告 2018年AR和VR的产值将达到178亿美元 比2017年的91亿
  • MATLAB中对自定义函数进行参数估计的方法

    先输入x和y的数据 然后在matlab的工作栏输入cftool 在弹出来的拟合工具箱内选择变量为你的x和y 然后右边的拟合方法选择custom equation 然后输入你要拟合的式子的形式 按fit就可以拟合了
  • 三种前台与后台,传表单数据包含文件上传。第三Jackson 将数据映射成实体类

    1使用表单action 属性 直接访问后台 后台是servlet 后台方法入参 protected void doPost HttpServletRequest request HttpServletResponse response 方法
  • 张钜楷:【黄金消息】1.13黄金原油实时行情分析策略及多空趋势解套

    黄金最新行情解析 黄金消息面解析 周四 1月13日 亚洲时段 现货黄金持稳于1824附近 周三 1月12日 金价连续第四个交易日上涨 数据显示美国通胀创39年新高 符合市场预期 引发美元贬值担忧 同时高通胀令市场提升避险黄金的魅力 不过 股
  • c++中的stack用法

    c stack 堆栈 是一个容器的改编 它实现了一个先进后出的数据结构 FILO 使用该容器时需要包含 include头文件 定义stack对象的示例代码如下 stacks1 stacks2 stack的基本操作有 1 入栈 如s push
  • Java调用JavaFX的方法

    Java调用JavaFX的方法 这三种方法分别为 1 用ScriptEngineManager类 这是基于JSR 223规范的java脚本API scripting API 可以在java程序中运行一些脚本 如 JavaFX script
  • [yolov4]yolov4.weights

    版本 https github com AlexeyAB darknet 权重链接 yolov4 weights https 72k us file 26468910 439532813 提取密码 446792 yolov4 conv 13
  • [现代控制理论]5_系统的可控性_controllability

    现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8 5 线性控制器设计 轨迹跟踪simulink 现代控制理论 8
  • php正则表达式检查用户输入的格式是否正确

    比如说用户提交了一个电话 或者提交了一个邮箱 我们怎么才能知道它是不是正确的电话和邮箱格式 用正则表达式来匹配 PHP提供了一种强大的方法创建和匹配文本中的模式 可以创建一些规则来查找串的模式 这个规则就成为正则表达式 d d d d d
  • Redis常见面试题

    一 缓存处理流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到 那直接返回空结果 二 缓存穿透 缓存穿透是指缓存和数据库中都没有的数据 而用户不断发起请求 如发起为i
  • Java反射1.类加载器概述与获取class文件对象的三种方式

    类加载器概述 一 类的加载 1 类的加载 当Java程序要使用某个类时 如果该类还未被加载到内存中 则系统会通过加载 连接 初始化三步来实现对这个类进行初始化 加载 就是指将类的class文件读入内存 并为之创建一个Class对象 任何类被
  • [Winfrom]Cefsharp配置与初始化

    摘要 在做客户端程序的时候 本来打算使用wpf的 但在内嵌cefsharp的时候 发现输入法有问题 所以使用了winform作为cefsharp的容器 系列文章 CefSharp 在同一窗口打开链接的方法 Winform CefSharp
  • 树的一些基础概念、堆和 python中heapq模块使用简介

    树定义 树是一种数据结构 比如 目录结构 树是由n个节点组成的集合 n 0 那么是一颗空树 n gt 0 那么存在一个节点为书的根节点 其他节点可分为m个子集 每个子集又为一棵子树 关于树的一些概念 根节点 例 A 叶子节点 不能分叉的节点
  • elementUI中图片上传upload组件,上传图片数据到后台

    结构
  • 【原创】谈谈服务雪崩、降级与熔断

    引言 首先 之所以谈这个话题呢 是发现现在很多人对微服务的设计缺乏认识 所以写一篇扫盲文 当然 考虑到目前大多微服务的文章都是口水文 烟哥争取将实现方式讲透 点清楚 让大家有所收获 OK 我要先说明一下 我有很长一段时间将服务降级和服务熔断