公众号:慕枫技术笔记

真正的大师永远怀着一颗学徒的心

引言

在微服务体系架构中,由于拆解的服务数变多了,服务发生故障的地方也会相应的增加,因此如何保证服务架构健壮是一个值得深思的问题。微服务容错机制正是这样一种稳定性解决方案,可以理解微微服务架构的保险丝,通过它可以对业务平台形成一种有效的保护机制。在发生平台异常时候,容错机制是平台稳定运行的最后一道屏障。


微服务架构为什么需要容错机制

说起来可能有一些年头了,以前小时候家里面经常出现电压不稳电灯忽明忽暗,有时候甚至出现短路停电的情况。每次一片漆黑的时候,大人们最常说的一句话就是:哎,估计又是保险丝断了哦。这里的保险丝就是保护家中电路电器的一种手段,当发生短路情况时,通过熔断保险丝来保护家中电器不受电流过载的影响。

在微服务架构体系中的熔断降级正是起到保险丝作用的基础组件。我们在进行架构设计时,不仅需要满足业务要求,同时也需要面向失败进行设计,意思就是说当外部条件发生变化或者内部出现异常时,平台的架构能够将这种异常的影响降到最低,强大的容错能力是优秀架构的关键指标。

回到今天的主题容错机制,我们可以反过来想,如果没有如果没有熔断降级系统容错机制,整个系统平台在异常情况下,会发生怎样的系统反应,我们先看下以下几种场景。

场景一:服务节点异常影响上游服务调用方

假设我们有客户端服务,需要分别调用Service1集群的接口、Service2集群的接口以及Service3集群的接口来完成一项业务流程,如果Service3集群发生异常情况,服务都还在,但是可能由于出现fullGC、慢查询、业务异常等情况,客户端在调用Service3集群时出现timeout,不能在规定时间内进行服务响应。当调用请求不断发出时,此时Client中的工作线程将会被这些调用的time out阻塞住,当业务不断进行请求时,Client对应的工作线程会越来越多的被阻塞住,进而导致客户端不可用。

当此客户端不可用时,可能上层调用方也会由Client的不可用向上影响,导致上层调用方也出现异常,就像病毒一样一层一层的传导,异常影响被不断向上放大,最终导致整个平台不可用。

场景二:流量激增导致服务不可用,影响其他依赖该服务的服务异常

我们假设Service1集群可以承载6000QPS的流量,正常情况下上游三个服务的流量总和都小于这个阈值。但是当流量发生激增时,其中一个服务的QPS就超过了10000QPS,超出了Service1集群的服务能力,因此造成了集群的异常出现响应异常的情况,此时Service2集群以及Service3集群由于依赖Service1集群的服务,同样会出现线程阻塞的情况,最终导致整个平台的异常。

因此基于以上分析,微服务架构中引入熔断降级组件是为了提升微服务架构整体的容错能力。主要避免以下三种场景对平台稳定性的影响。

1、单个服务集群节点出现异常故障,其影响范围可能被无限向上游服务放大;
2、由于使用了共同基础服务,基础服务出现异常时,多租户相互影响;
3、某个服务的瞬时流量突增,某个服务集群扛不住,影响整个平台稳定性;

如何破局

资源隔离

我们以现实生活中的船舱为例,实际的船舱格局大致如下所示,船舱底部并不是完全的一整个空心结构,而是通过格子进行区域隔离。为什么这么设计呢?主要还是为了一旦发生船舱漏水,只影响其中一个隔离区域,而不是整个船舱都灌满水,从而达到一定程度保护船体不会因为一处漏洞而沉没的目的。

那么借助于船舱隔离的思想,在我们的程序世界中,我们是不是也可以采用资源隔离的方式来保护我们的微服务架构呢?答案是肯定的,也的确是这么做的。

1、线程池隔离

我们可以通过线程池隔离的方式来实现资源的隔离,不同的请求使用相应的线程池来处理,即便出现请求资源time out的情况,最多影响当前线程池的资源,而不会影响整个服务的线程资源。类似船舱中的隔离区域。

2、信号量隔离

信号量主要是用来控制线程数的,规定好一些调用最大的并发量,超过指定的信号量后,可以将请求丢弃或者延时处理,防止线程的不断增长导致的服务异常。

熔断

所谓熔断,正如上文所说,它的作用就是想保险丝一样,在流量过大或者请求错误率过大的情况下,此时保险丝就熔断了,对应的业务链路断开,不再提供服务。当流量恢复正常或者错误降低后,熔断开关再进行闭合,之前的业务链路重新恢复。这是一种很好的保护后端微服务的一种方式。
在大促期间,平台需要用足够的机器去保证核心商业链路正常运转,对于退款、退货这种服务,则可以通过暂时熔断的方式不对外提供服务,当大促过了之后再进行恢复。

在熔断机制中,核心的内容就是断路器的设计,断路器设计主要有两方面一个是状态转换的设计,一个是如何根据阈值以统计数据来执行核心的断路功能。

降级

和熔断的场景有点蕾丝,当系统流量过多时,系统资源有限,平台处理不过来那么多的请求。此时就可以可将不是那么重要的功能模块进行降级处理,停止对外服务,这样可以释放出更多的资源供给核心功能的去用。如下所示,商品详情页中,商品服务中方商品列表才是最重要的服务,至于用户的积分以及用户的头像此时并不是核心业务,所以在系统能力有限的情况下,优先让商品服务对外提供服务,其他服务进行降级处理。

总结

本文主要对微服务架构中的容错机制进行了分析,从为什么要有容错机制到如何通过资源隔离、熔断以及降级等方式实现微服务容错保护进行了阐述。下一篇文章将带大家看看熔断降级组件Hystrix的工作原理,敬请期待哦。


我是慕枫,感谢各位小伙伴点赞、收藏和评论,文章持续跟新,我们下期再见!

微信搜索:慕枫技术笔记,优质文章持续更新,我们有学习打卡的群可以拉你进,一起努力冲击大厂,另外有很多学习以及面试的材料提供给大家。

微服务架构服务容错设计分析相关推荐

  1. 微服务架构-服务注册中心和服务网关(6.8) (转载)

    原文链接:微服务架构-服务注册中心和服务网关(6.8) 这篇文章还是基于SpringCloud开源框架体系来谈下对Eureka服务注册中心和Zuul服务网关在使用上的一些理解和说明.在使用微服务架构进 ...

  2. 下一代微服务架构——服务网格Service Mesh

    下一代微服务架构--服务网格Service Mesh 下一代微服务架构--服务网格Service Mesh 服务治理 什么是服务治理 系统架构形态演进 现阶段存在的问题 Service Mesh是什么 ...

  3. 微服务架构 —— 服务雪崩与容错方案

    导航 一.什么是服务雪崩 二.雪崩效应的三个核心原因 三.容错 四.业界常见容错思路 五.常见容错组件 一.什么是服务雪崩 服务雪崩 指的是微服务架构中,微服务各节点之间由于网络通信异常或微服务自身故 ...

  4. 微服务架构 — 服务治理 — 服务调用链可视化

    微服务架构所面临的问题 微服务架构中,服务之间会有错综复杂的依赖关系,例如:一个前端请求一般会依赖于多个后端服务,称为 "1=>N 扇出".在实际生产环境中,服务往往不是百分 ...

  5. Spring Cloud构建微服务架构-服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 愿意了解源码的朋友直接求求交流分享技术 一零三八七七四六二六 我们使用Sp ...

  6. 微服务架构---服务降级

    1 简介 什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作. 如果还是不理解,那 ...

  7. 微服务架构-服务网关(Gateway)-服务网关在微服务中的应用

    服务网关在微服务中的应用 我们将目光转向Spring Cloud应用的外围,讨论微服务架构下的各个模块如何对外提供服务. 1.对外服务的难题 微服务架构下的应用系统体系很庞大,光是需要独立部零的基础组 ...

  8. 微服务架构 | 服务注册发现中心/配置中心/消息总线 - [nacos]

    INDEX §1 简介 §2 简单使用 §2.1 搭建 nacos-server §2.2 作为服务注册发现中心 §2.3 作为服务配置中心 §2.4 切换 nacos 的一致性协议 §3 配置的层次 ...

  9. 微服务架构—服务降级

    1 简介 什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作. 如果还是不理解,那 ...

最新文章

  1. java类的基本组成和使用,Java架构师成长路线
  2. scikit-learn一般实例之一:绘制交叉验证预测
  3. 深度梳理这10个国家的AI发展战略
  4. Windows Socket和Linux Socket编程的区别
  5. 发生在“注解”@的那些事儿
  6. 巡风代码架构简介以及Flask的项目文件结构简介
  7. python基础装饰器_Python基础之装饰器
  8. python编译安装没有c扩展_pybind11—python C/C++扩展编译
  9. Adafruit_NeoPixel常用库函数详解
  10. 深度学习算法原理——神经网络的基本原理
  11. 阿里大佬手把手教你用jmeter做压力测试(详图)
  12. java运维工程师简历模板_系统运维工程师个人个人简历模板.doc
  13. /usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录
  14. CSP 2014-03-1 相反数(C++)
  15. Sicily2000——Toy Shopping
  16. 怎么找主播卖货?最靠谱的5种直播带货方式
  17. JAVA方法3-方法的重载
  18. 【多数据中心】分布式数据同步设计方案
  19. 京东方GV185FHM-N10-DM30工业液晶屏 18.5寸全视角液晶屏
  20. 【网络原理7】认识HTTP

热门文章

  1. 照明硬件基础知识(四)—— LED灯(半导体光源)工作原理及关键参数
  2. CSS学习笔记----CSS3自定义字体图标
  3. Android通过OMA获得ESE的CPLC
  4. 可擦写光盘不能擦除和刻写_什么是可擦写光盘
  5. 小酌重构系列[3]——方法、字段的提升和降低
  6. 韩国计划扩展网络道德课程
  7. 仿微信图片查看器入场退场动画
  8. DD-WRT v24-sp2的WDS中继设置
  9. Android:详细解析RSSI概念
  10. 大话西游之GUI编程—(—)DOS时代