您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

谈谈服务雪崩、降级与熔断

时间:2019-10-31 14:03:15  来源:  作者:
来源公众号孤独烟 ,
作者孤独烟

引言

首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文。当然,考虑到目前大多微服务的文章都是口水文,烟哥争取将实现方式讲透,点清楚,让大家有所收获!

OK,我要先说明一下,我有很长一段时间将服务降级服务熔断混在一起,认为是一回事!

为什么我会有这样的误解呢?

针对下面的情形,如图所示

 

谈谈服务雪崩、降级与熔断

 

 

当Service A调用Service B,失败多次达到一定阀值,Service A不会再去调Service B,而会去执行本地的降级方法!

对于这么一套机制:在Spring cloud中结合Hystrix,将其称为熔断降级!

所以我当时就以为是一回事了,毕竟熔断和降级是一起发生的,而且这二者的概念太相近了!

后面接触了多了,发现自己理解的还是太狭隘了,因此本文中带着点我自己的见解,大家如果有不同意见,请轻喷!毕竟还有很多人认为两者是一致的!

正文

服务雪崩

OK,我们从服务雪崩开始讲起!假设存在如下调用链

 

谈谈服务雪崩、降级与熔断

 

 

而此时,Service A的流量波动很大,流量经常会突然性增加!那么在这种情况下,就算Service A能扛得住请求,Service B和Service C未必能扛得住这突发的请求。

此时,如果Service C因为抗不住请求,变得不可用。那么Service B的请求也会阻塞,慢慢耗尽Service B的线程资源,Service B就会变得不可用。紧接着,Service A也会不可用,这一过程如下图所示

 

谈谈服务雪崩、降级与熔断

 

 

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

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

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

服务熔断

那么,什么是服务熔断呢?

服务熔断:当下游的服务因为某种原因突然变得不可用响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

需要说明的是熔断其实是一个框架级的处理,那么这套熔断机制的设计,基本上业内用的是断路器模式,如Martin Fowler提供的状态转换图如下所示

 

谈谈服务雪崩、降级与熔断

 

 

  • 最开始处于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)改完配置中心的配置后,应用就可以自动检测到配置的变化,进行降级!(这句不了解的,了解一下配置中心的热刷新功能)


Tags:雪崩   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关推荐
目前的互联网系统没有几个不使用缓存的, 但是只要使用缓存的话就会面临这几个问题, 如使用redis缓存技术, 可能会遇到缓存的雪崩, 穿透, 以及击穿. 首先来看一个简单的正常...【详细内容】
2021-05-19  Tags: 雪崩  点击:(48)  评论:(0)  加入收藏
更多内容,欢迎关注微信公众号:全菜工程师小辉~缓存穿透缓存系统,一般流程都是按照key去查询缓存,如果不存在对应的value,就去后端系统(例如:持久层数据库)查找。如果key对应的value...【详细内容】
2021-04-12  Tags: 雪崩  点击:(127)  评论:(0)  加入收藏
对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一。在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很容易就遇到缓...【详细内容】
2020-12-14  Tags: 雪崩  点击:(51)  评论:(0)  加入收藏
“微服务的战争” 是一个关于微服务设计思考的系列题材,主要是针对在微服务化后所出现的一些矛盾/冲突点,不涉及具体某一个知识点深入。如果你有任何问题或建议,欢迎随时交流。...【详细内容】
2020-09-01  Tags: 雪崩  点击:(53)  评论:(0)  加入收藏
随着互联网的越来越普及,用户越来越多,系统性能瓶颈成了越来越热门的话题。要解决性能问题的技术手段有很多,比如:缓存、CDN加速、页面静态化、集群、分布式、异步等。缓存通常...【详细内容】
2020-06-27  Tags: 雪崩  点击:(13)  评论:(0)  加入收藏
作为一个内存数据库,redis也总是免不了有各种各样的问题,这篇文章主要是针对其中两个问题进行讲解:缓存穿透和缓存雪崩。并给出一些解决方案。这两个问题是基本问题也是面试常...【详细内容】
2020-03-14  Tags: 雪崩  点击:(24)  评论:(0)  加入收藏
一、Redis雪崩、穿透、并发等5大难题解决方案缓存雪崩数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机...【详细内容】
2019-12-19  Tags: 雪崩  点击:(84)  评论:(0)  加入收藏
首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文。当然,考虑到目前大多微服务的文章都是口水文,烟哥争取将实现方式讲透,点清楚,让大家有所收获!...【详细内容】
2019-10-31  Tags: 雪崩  点击:(175)  评论:(0)  加入收藏
本篇文章主要谈谈Redis中很容易出现的三大问题现象:缓存击穿、缓存穿透以及缓存雪崩。不过在介绍这三个问题现象之前,我们首先需要先来了解下Redis中key的过期淘汰机制。众所...【详细内容】
2019-10-12  Tags: 雪崩  点击:(66)  评论:(0)  加入收藏
一、缓存穿透1.何为缓存穿透?缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查...【详细内容】
2019-09-23  Tags: 雪崩  点击:(102)  评论:(0)  加入收藏
▌简易百科推荐
COLA架构中,一些建议的命名规范,可供参考,不同的COLA版本也略有差异。 在COLA架构中,我们也能找到以前熟悉的VO,DTO等对象,只不过在COLA中后缀名变了:VO->CO,COLA中CO对象用于展...【详细内容】
2021-07-16  软件架构    Tags:COLA 架构   点击:(4)  评论:(0)  加入收藏
作者 | Natan Silnitsky译者 | 平川策划 | 万佳在过去一年里,我一直是数据流团队的一员,负责 Wix 事件驱动的消息传递基础设施(基于 Kafka)。有超过 1400 个微服务使用这个基础...【详细内容】
2021-07-12  技术联盟总坛    Tags:架构   点击:(6)  评论:(0)  加入收藏
前言要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。从单体应用到微服务并不是一蹴而就的,这是一...【详细内容】
2021-07-09  码农老K    Tags:微服务架构   点击:(8)  评论:(0)  加入收藏
大家都知道,MyBatis 框架是一个持久层框架,是 Apache 下的顶级项目。Mybatis 可以让开发者的主要精力放在 sql 上,通过 Mybatis 提供的映射方式,自由灵活的生成满足需要的 sql 语句。使用简单的 XML 或注解来配置和映射原...【详细内容】
2021-07-06  武哥  武哥聊编程  Tags:MyBatis   点击:(12)  评论:(0)  加入收藏
契约测试◎ 契约测试概述◎ 契约测试与TDD◎ 契约测试与独立交付◎ 契约测试的相关技术与用法实战在微服务架构中最常见的事情就是远程调用,如服务和服务之间的远程调用,前端...【详细内容】
2021-07-04  java领路人  今日头条  Tags:微服务   点击:(11)  评论:(0)  加入收藏
兄弟姐妹们,一定要找好自己赖以生存的老窝。南橘北枳,根正才能苗红,否则你看起来一些主流的技术,可能就会成为毒药。...【详细内容】
2021-06-29  小姐姐味道  公众号   Tags:架构   点击:(16)  评论:(0)  加入收藏
前言在 4 月 27 日举办的 Gopher China 2019 中,来自花椒直播的周洋进行了题为《花椒直播关于创业公司中台的技术思考与实践》的演讲,以下为演讲实录。No.0背景介绍 周洋:2009...【详细内容】
2021-06-29  MrDeng008    Tags:中台   点击:(10)  评论:(0)  加入收藏
环境:JavaIDEAMaven 多层级架构Jenkins描述:由于架构是 Maven 多层级架构,采用 Jenkins 打包发布的方式对服务部署,与传统的单层架构不同。传统的单层架构直接在 pom.xml 文件层...【详细内容】
2021-06-29  旷野历程  CSDN  Tags:Maven   点击:(15)  评论:(0)  加入收藏
应用系统架构种类及优缺点分析 软件体系结构是构建计算机软件实践的基础。 软件架构是一个系统的草图。它描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确...【详细内容】
2021-06-29  梦幻神域    Tags:架构   点击:(13)  评论:(0)  加入收藏
1、Feign简介Feign是一种声明式、模板化的HTTP客户端。使用Feign,可以做到声明式调用。尽管Feign目前已经不再迭代,处于维护状态,但是Feign仍然是目前使用最广泛的远程调用框架...【详细内容】
2021-06-29  深夜敲代码  今日头条  Tags:SpringCloud   点击:(15)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条