一、雪崩效应

  在微服务架构中,由于服务和服务之间可以互相调用,一项工作的完成可能会依赖调用多个微服务模块,但由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪;再加上服务和服务之间的依赖性,瘫痪会迅速传播,给整个微服务系统造成严重的后果,这就是服务故障的“雪崩”效应。

服务雪崩效应形成的阶段

1、服务提供者不可用

  • 硬件故障。硬件损坏导致服务器主机宕机,或网络硬件故障造成服务提供者的不可访问。
  • 程序Bug
  • 缓存击穿。一般发生在缓存应用重启,所有缓存被清空时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端,造成服务提供者超负荷运行,引起服务不可用。
  • 用户大量请求

2、重试加大流量

  • 用户重试
  • 代码逻辑重试

3、服务调用者不可用

  • 同步等待造成资源耗尽。同步调用时,产生大量的等待线程占用系统资源。

二、服务雪崩的应对措施

针对造成服务雪崩的不同原因,可以采用不同的应对措施。

1、流量控制

  • 网关限流
  • 用户交互限流,例如:1.采用加载动画,提高用户的忍耐等待时间。2.提交按钮添加强制等待机制等。
  • 关闭重试

2、改进缓存模式

  • 缓存预加载
  • 同步改为异步刷新

3、服务自动扩容

  • AWS的auto scaling

4、服务调用者降级服务

  • 资源隔离。主要是对调用服务的线程池进行隔离。
  • 对依赖服务进行分类。根据具体业务,将依赖服务分为强依赖和弱依赖,强依赖服务不可用会导致当前业务中止,弱依赖服务不可用则不会。
  • 不可用服务的调用快速失败。一般通过 超时机制熔断器 和熔断后的 降级方法 来实现。

三、使用Hystrix预防服务雪崩

3.1、Hystrix的设计原则包括:

  • 资源隔离(不把鸡蛋放在一个篮子里)
  • 熔断器(及时止损)
  • 命令模式

资源隔离

  在一个高度服务化的系统中,一个业务逻辑经常需要依赖多个服务模块,例如下图左,查看商品详情业务需要依赖商品介绍、价格查询、商品评价三个服务模块,调用三个依赖服务会共享商品详情服务的线程池,如果其中某个模块不可用,线程池所有的线程都会因为等待响应而被阻塞,从而造成服务雪崩;

  Hystrix通过为每个依赖服务分配独立的线程池进行资源隔离,从而避免整个服务雪崩。如下图右,即便某个服务模块出错,只会导致分配给它的线程处于等待状态,而不影响其他依赖服务的调用。

  这样做带来的代价就是维护多个线程池需要额外的性能开销。

熔断器

  熔断器模式定义了熔断器打开关闭的转换。

  定义一个服务模块的健康状况=请求失败数/请求总数。

  熔断器工作原理,需要设定一个对于服务健康状况的阈值:

  1. 熔断器开关关闭,此时请求可以直接通过熔断器到达后台;
  2. 如果当前服务健康状况高于设定阈值,开关保持关闭,否则,开关转变为打开状态;
  3. 当熔断器开关打开时,请求被禁止通过熔断器,直接返回失败;
  4. 当熔断器开关打开一段时间(熔断器时间窗)后,自动进入半开状态,此时允许一个请求通过,当该请求调用成功,熔断器恢复关闭状态,若该请求失败,继续保持打开状态。

  熔断器的开关能保证服务调用者在调用服务异常的时候,快速返回结果,避免了造成客户端大量的同步等待以及大量无效请求影响系统吞吐量,并且熔断器能在一段时间后自动探测请求执行结果,从而有了恢复服务调用的可能。

命令模式

  Hystrix使用命令模式(继承自HystrixCommand类)来包裹具体的服务调用逻辑(run方法),并在命令模式中添加了服务调用失败后的降级逻辑(getFallback),同时也可以在Command的构造方法中定义当前服务线程池和熔断器的相关参数。

3.2、Hystrix的应对措施

  • 把每个依赖进行隔离,对依赖的调用全部包装成HystrixCommand或者HystrixObservableCommand
  • 对依赖的调用耗时设置阈值,超过阈值直接判定超时
  • 对每个依赖维护一个连接池,如果连接池满直接拒绝访问
  • 评估服务模块的健康状态,超过指定的阈值的话直接熔断处理,对依赖的请求访问直接fallback处理(由开发者自己实现)
  • 熔断生效后,时间窗后放出一个请求探测,决定是否要恢复服务
  • 近乎实时生效

3.3、Hystrix的内部处理逻辑

  1. 构建Hystrix的Command对象, 调用执行方法.
  2. Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.
  3. 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.
  4. 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.
  5. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
  6. 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
  7. 若服务执行成功, 返回正常结果.
  8. 若服务降级方法getFallback执行成功, 则返回降级结果.
  9. 若服务降级方法getFallback执行失败, 则抛出异常

【Spring Cloud】服务容错保护:Hystrix(四)的更多相关文章

  1. spring cloud 服务容错保护 - Hystrix

    1.为什么要断路器 在微服务架构中通常会涉及到多个服务间调用,处于调用链路底层的基础服务故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供 ...

  2. Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】

    Spring Cloud(四):服务容错保护 Hystrix[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  分布式系统中经常会出现某个基础服务不可用 ...

  3. Spring Cloud (8) 服务容错保护-Hystrix依赖隔离

    依赖隔离 docker使用舱壁模式来实现进程的隔离,使容器与容器之间不会互相影响.而Hystrix则使用该模式实现线程池的隔离,它会为每一个Hystrix命令创建一个独立的线程池,这样就算在某个Hys ...

  4. 白话SpringCloud | 第五章:服务容错保护(Hystrix)

    前言 前一章节,我们知道了如何利用RestTemplate+Ribbon和Feign的方式进行服务的调用.在微服务架构中,一个服务可能会调用很多的其他微服务应用,虽然做了多集群部署,但可能还会存在诸如 ...

  5. Spring Cloud (7) 服务容错保护-Hystrix服务降级

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以互相调用,在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务通常会集群 ...

  6. Spring Cloud (9) 服务容错保护-Hystrix断路器

    断路器 断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中又电路发生短路时,断路器能够及时的切断故障电路,放置发生过载.发热.甚至起火等严重后果. 在分布式架构中,断路器模式的作用也是类似, ...

  7. SpringCloud开发学习总结(五)—— 服务容错保护Hystrix

    在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式相互依赖.但由于每个单元都在不同的进程中运行,一来通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身 ...

  8. 服务容错保护hystrix

    灾难性雪崩效应 如何解决灾难性雪崩效应 降级 超时降级.资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据.实现一个 fallback 方法, 当请求后端服务出现异常的时候, 可以使用 ...

  9. spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护

    在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖.但是如果有一些服务出现问题了会怎么样? 比如说有三个服务(ABC),A调用B,B调用C.由于网络延迟或C ...

  10. 【Dalston】【第四章】容错保护(Hystrix)

    我们在实践微服务架构时,通常会将业务拆分成一个个微服务,微服务之间通过网络进行通信,进行互相调用,造成了微服务之间存在依赖关系.我们知道由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如 ...

随机推荐

  1. jvm对象内存分配

    一.jvm简单结构图 1.jvm内存对象分配整体流程: 1.类加载子系统和方法区 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外, ...

  2. JavaScript自动播放背景音乐

    问题描述 js控制audio自动播放音乐时报错: Uncaught (in promise) DOMException 我的报错之前的代码: <audio id="myaudio&qu ...

  3. 关于canvas合成分享图

    最近在uni-app项目中遇到一个合成分享图的需求,其实最开始是用原生写法来做的,后台发现在PC端测试是可以的,但在APP模拟器中会出现问题,可能是因为两者的js环境不同吧,uni-app官网也说了这 ...

  4. Hive安装与简单使用并集成SparkSQL

    ## Hive环境搭建1. hive下载:http://archive-primary.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gzwget h ...

  5. sublime_REPL使用及安装教程(解决Sublime无交互问题)

    谈到python编程工具能想到那些? pycharm?IDLE? Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等,还可自定义键绑定,菜单和工具栏. ...

  6. 初识PE文件结构

    前言 目前网络上有关PE文件结构说明的文章太多了,自己的这篇文章只是单纯的记录自己对PE文件结构的学习.理解和总结. 基础概念 PE(Portable Executable:可移植的执行体)是Win3 ...

  7. 阿里云服务器CentOS6.9 tomcat配置https安全访问

    应用场景 上线微信小程序的时候,域名要求https安全格式,否则获取数据异常. 第一步.SSL证书获取 获取SSL证书方式很多种,包括网页生成.工具生成等,这里我使用阿里云平台获取免费ssl证书的方法 ...

  8. Idea 配置Jrebel热部署

    虽说Idea自带热更新功能,但是一旦mapper更改,则不能及时更新,影响开发效率. 接下来,我们来配置Jrebel热更新,简单方便实用. 第一步:进入插件下载页面. 第二步:安装jrebel插件. ...

  9. springboot WebMvcConfigurerAdapter替代

    过时应用: @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public vo ...

  10. 死磕 java线程系列之线程模型

    问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...