摘要:伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前。服务熔断、服务降级,好高大上的样子,以前望尘莫及,今日终于揭开它神秘面纱。

服务雪崩效应的定义很简单,是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。

可以结合下图进行理解:

服务雪崩

上图中,A作为基础的服务提供者,为B和C提供服务,D、E、F是B和C服务的调用者,当A不可用时,将引起B和C的不可用,并将这种不可用放大到D、E、F,从而可能导致整个系统的不可用,服务雪崩的产生可能导致分布式系统的瘫痪。

服务雪崩效应的产生一般有三个流程,服务提供者不可用 -> 重试加大流量 -> 服务调用者不可用

服务提供者不可用的出现的原因有很多,可能是因为服务器的宕机或者网络故障,也可能是因为程序存在的Bug,也有可能是大量的请求导致服务提供者的资源受限无法及时响应,还有可能是因为缓存击穿造成服务提供者超负荷运行等等,毕竟没有人能保证软件的完全正确性。

在服务提供者不可用发生之后,用户可能无法忍受长时间的等待,不断地发送相同的请求,服务调用者重新调用服务提供者,同时服务提供者中可能存在对异常的重试机制,这些都会加大对服务提供者的请求流量。然而此时的服务提供者已经是一艘破船,它也无能无力,无法返回有效的结果。

最后是服务调用者因为服务提供者的不能用导致了自身的崩溃。当服务调用者使用同步调用的时候,大量的等待线程将会耗尽线程池中的资源,最终导致服务调用者的宕机,无法响应用户的请求,服务雪崩效应就此发生了。

断路器

在分布式系统中,不同服务之间发生的调用非常常见,当服务提供者不可用时就很有可能发生服务雪崩的效应,导致整个系统的不可用。所以为了预防这种请求的发生,可以通过断路器模式进行预防(类比电路中的断路器,在电路过大的时候自动断开,防止电线过热损害整条电路)。

断路器模式背后的思想很简单,将远程函数调用包装到一个断路器对象中,用于监控函数调用过程的失败。一旦该函数调用的发生失败的次数在一段时间内到达一定的阀值,那么这个断路器将会跳闸,然后接下来时间里对该被保护函数调用的线程将会被断路器直接返回一个错误,而不再发生该函数的真实调用。这样子就避免了服务调用者在服务提供者不可用时发送请求,从而减少线程池中资源的消耗,保护了服务调用者。

断路器时序图

虽然上面的断路器在打开的时候避免了被保护的函数调用,但是当情况恢复正常时,需要外部干预来重置断路器,使得函数调用可以重新发生。所以合理的断路器应该具备以下的开关转化逻辑,它需要一个机制来控制它的重新闭合,图6-3中是通过一个重置时间来决定。

断路器状态图

  • 关闭状态: 断路器处于关闭状态,统计调用失败次数,在一段时间内到达一定的阀值后断路器打开。
  • 打开状态: 断路器处于打开状态,对函数调用直接返回失败错误,不发生真正的函数调用。设置了一个重置时间窗,在重置时间窗结束后,断路器来到半开状态。
  • 半开状态: 断路器处于半开状态,此时允许进行函数调用,当调用都成功了(或者成功到达一定的比例),关闭断路器,否则认为服务没有恢复,重新打开断路器。

断路器的打开能保证服务调用者在调用异常服务时,快速返回结果,避免大量的同步等待,减少服务调用者的资源消耗。并且断路器能在打开的一段时间后继续侦测请求执行结果,提供断路器关闭的可能,恢复服务的调用。

服务降级操作

断路器是为了隔断服务调用者和异常服务提供者,防止了服务雪崩的现象,是一种保护的措施。而服务降级的意思是在整体资源不够的时候,适当的放弃部分服务,将主要的资源投放到核心服务中,待渡过难关之后,再把关闭的服务重启回来。

在Hystrix中,当服务间调用发生问题时,它将采用备用的fallback方法代替主方法执行并返回结果,这就进行了服务降级,同时触发了断路器的逻辑。当调用服务失败次数在一段时间内超过了断路器的阀值时(此时一直调用fallback中的逻辑返回结果),断路器将打开,此时将不再调用函数,而是快速失败,直接执行fallback逻辑,服务降级,减少服务调用者的资源消耗,保护服务调用者中的线程资源。

资源隔离

在货船中,为了防止漏水和火灾的扩散,一般会将货仓进行分割,避免了一个货仓出事导致整艘船沉没的悲剧。同样的,在Hystrix中,也采用了这样的舱壁模式,将系统中的服务提供者隔离起来,一个服务提供者延迟升高或者失败,并不会导致整个系统的失败,同时也能够控制调用这些服务的并发度。

  • 线程与线程池

Hystrix中通过将调用服务线程与服务访问的执行线程分隔开来,调用线程能够空出来去做其他的工作而不至于被服务调用的执行的阻塞过长的时间。

在Hystrix中使用独立的线程池对应每一个服务提供者,来隔离和限制这些服务,于是,某个服务提供者的高延迟或者饱和资源受限只会发生在该服务提供者对应的线程池中。

如上图中,Dependency I的调用失败或者高延迟仅会导致自身对应的线程池中的5个线程的阻塞,并不会影响其他服务提供者的线程池。系统完全与服务提供者请求隔离开来,即使服务提供者对应的线程完全耗尽,并不会影响系统中的其他请求。

注意在对应服务提供者的线程池被占满时,Hystrix会进入了fallback逻辑,快速失败,保护服务调用者的资源稳定。

  • 信号量

除了线程池外,Hystrix还可以通过信号量(计数器)来限制单个服务提供者的并发量。如果通过信号量来控制系统负载,将不再允许设置超时控制和异步化调用,这就表示在服务提供者出现高延迟,其调用线程将会被阻塞,直至服务提供者的网络请求超时,如果对服务提供者的稳定性有足够的信心,可以通过信号量来控制系统的负载。

总结

我们在这篇文章介绍了熔断、服务雪崩、服务降级等概念。在处理微服务容错时,这些都是常用的技术,我们需要首先了解其概念。

点击关注,第一时间了解华为云新鲜技术~

微服务容错时,这些技术你要立刻想到相关推荐

  1. 基于微服务和Docker容器技术的PaaS云平台架构设计

    本文讲的是基于微服务和Docker容器技术的PaaS云平台架构设计[编者的话]在系统架构上,PaaS云平台主要分为微服务架构.Docker容器技术.DveOps三部分,这篇文章重点介绍微服务架构的实施 ...

  2. 微服务电商项目技术全解析

    一.项目介绍 7d-mall-microservice 是一套微服务电商,其是在开源电商项目 mall-swarm 上进行了改造,采用了 Spring Cloud Hoxton & Aliba ...

  3. 《高楼的性能工程实战课》微服务电商项目技术全解析

    文章目录 一.项目介绍 二.整体结构 三.预备知识 1.什么是 SpringCloud ? 2.Spring .SpringBoot 和 Spring Cloud 的关系 3.Spring Cloud ...

  4. 儒猿秒杀季!微服务限流熔断技术源码剖析与架构设计

    疯狂秒杀季:49元秒杀 原价 299元 的 <微服务限流熔断技术源码剖析与架构设计课> 今天 上午11点,仅 52 套,先到先得! === 课程背景 === 成为一名架构师几乎是每个程序员 ...

  5. 第四章 微服务容错Resilience4j

    4.1 微服务容错简介 在⾼并发访问下,⽐如天猫双11,流量持续不断的涌⼊,服务之间的相互调⽤频率突然增加,引发系统负载过⾼,这时系统所依赖的服务的稳定性对系统的影响⾮常⼤,⽽且还有很多不确定因素引起 ...

  6. 四,微服务容错Resilience4j(待改)

    写在前面的话:本文大部分(说全部也没问题)都是抄写的,课堂的资料给的特别好.感觉耻于提笔,但不写上就影响整个博客内容了.以后会改/写出我的笔记的. 感谢你的路过,希望学生的笔记能给你一点微不足道的参考 ...

  7. 微服务容错的一些手段

    微服务容错的手段 微服务简介 隔离 线程池隔离 信号量隔离 线程池隔离和信号量隔离的区别 熔断 降级 限流 漏桶算法 令牌桶算法 固定时间窗口算法 滑动时间窗口算法 本篇博客主要搬运自开课吧提供的课堂 ...

  8. 微服务精华问答 | 在使用微服务架构时,您面临哪些挑战?

    戳蓝字"CSDN云计算"关注我们哦! 过去几年来,"微服务架构"这个术语出现了,它描述了一种将软件应用程序设计为可独立部署的服务套件的特定方式.尽管这种架构风格 ...

  9. 微服务 RocketMQ-延时消息 消息过滤 管控台搜索问题

    ~~微服务 RocketMQ-延时消息 消息过滤 管控台搜索问题~~ RocketMQ-延时消息 实现延时消息 RocketMQ-消息过滤 Tag标签过滤 SQL标签过滤 管控台搜索问题 Rocket ...

最新文章

  1. 分布式架构下,Session 共享有什么方案?
  2. HtmlUnit爬取页面列表链接
  3. Oracle SQL Developer语言设置
  4. tensorflow随笔-变量
  5. tensorflow官方posenet模型解析
  6. 深度学习之 FPN (Feature Pyramid Networks)
  7. php获取页面中的指定内容,php 获取页面中指定内容的实现类
  8. php学到什么程度可以学thinkphp,thinkphp学习一
  9. 2018年python工作好找吗-2018年涨工资了吗?Python 工程师薪资最新出炉
  10. [转]VC编辑中的一些方法
  11. android view强制重绘_安卓自定义 view 不能正常重绘
  12. ASP.Net本地化/国际化解决方案原理和代码示例
  13. K近邻算法,Matlab实现
  14. 合宙Air720U724U722U Lua 固件更新说明
  15. 物联网技术及应用计算机,物联网的关键技术及计算机物联网的应用
  16. vue3中的provide/inject(提供/注入)
  17. RGB颜色转换为16进制颜色
  18. 保研之旅5:上海科技大学信息学院夏令营
  19. 软件测试职业发展三步曲之一 - 软件测试职业发展方向
  20. 欢迎进入夜色的繁星博客导航一站式搜索(所有博客的汇总帖)

热门文章

  1. Kali Linux系统设置中文语言环境-1
  2. HTML placeholder
  3. dsd语言证书c1是什么,DSD一级德语语言证书考试在嘉兴高级中学举行
  4. mysql 存储过程 批量导入数据_sql 利用存储过程批量导入数据
  5. 定义mysql日志_请教:如何查看mysql数据定义操作的日志
  6. python实现多人聊天论文_python网络编程 双人多人聊天
  7. 对于李群和李代数的理解
  8. C#学习笔记_12_枚举结构体
  9. GoldenGate中使用FILTER,COMPUTE 和SQLEXEC命令
  10. Ant学习---第一节:Ant安装和简单使用