【Spring Cloud】服务容错保护:Hystrix(四)
一、雪崩效应
在微服务架构中,由于服务和服务之间可以互相调用,一项工作的完成可能会依赖调用多个微服务模块,但由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪;再加上服务和服务之间的依赖性,瘫痪会迅速传播,给整个微服务系统造成严重的后果,这就是服务故障的“雪崩”效应。
服务雪崩效应形成的阶段
1、服务提供者不可用
- 硬件故障。硬件损坏导致服务器主机宕机,或网络硬件故障造成服务提供者的不可访问。
- 程序Bug
- 缓存击穿。一般发生在缓存应用重启,所有缓存被清空时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端,造成服务提供者超负荷运行,引起服务不可用。
- 用户大量请求
2、重试加大流量
- 用户重试
- 代码逻辑重试
3、服务调用者不可用
- 同步等待造成资源耗尽。同步调用时,产生大量的等待线程占用系统资源。
二、服务雪崩的应对措施
针对造成服务雪崩的不同原因,可以采用不同的应对措施。
1、流量控制
- 网关限流
- 用户交互限流,例如:1.采用加载动画,提高用户的忍耐等待时间。2.提交按钮添加强制等待机制等。
- 关闭重试
2、改进缓存模式
- 缓存预加载
- 同步改为异步刷新
3、服务自动扩容
- AWS的auto scaling
4、服务调用者降级服务
- 资源隔离。主要是对调用服务的线程池进行隔离。
- 对依赖服务进行分类。根据具体业务,将依赖服务分为强依赖和弱依赖,强依赖服务不可用会导致当前业务中止,弱依赖服务不可用则不会。
- 不可用服务的调用快速失败。一般通过 超时机制、熔断器 和熔断后的 降级方法 来实现。
三、使用Hystrix预防服务雪崩
3.1、Hystrix的设计原则包括:
- 资源隔离(不把鸡蛋放在一个篮子里)
- 熔断器(及时止损)
- 命令模式
资源隔离
在一个高度服务化的系统中,一个业务逻辑经常需要依赖多个服务模块,例如下图左,查看商品详情业务需要依赖商品介绍、价格查询、商品评价三个服务模块,调用三个依赖服务会共享商品详情服务的线程池,如果其中某个模块不可用,线程池所有的线程都会因为等待响应而被阻塞,从而造成服务雪崩;
Hystrix通过为每个依赖服务分配独立的线程池进行资源隔离,从而避免整个服务雪崩。如下图右,即便某个服务模块出错,只会导致分配给它的线程处于等待状态,而不影响其他依赖服务的调用。
这样做带来的代价就是维护多个线程池需要额外的性能开销。
熔断器
熔断器模式定义了熔断器打开关闭的转换。
定义一个服务模块的健康状况=请求失败数/请求总数。
熔断器工作原理,需要设定一个对于服务健康状况的阈值:
- 熔断器开关关闭,此时请求可以直接通过熔断器到达后台;
- 如果当前服务健康状况高于设定阈值,开关保持关闭,否则,开关转变为打开状态;
- 当熔断器开关打开时,请求被禁止通过熔断器,直接返回失败;
- 当熔断器开关打开一段时间(熔断器时间窗)后,自动进入半开状态,此时允许一个请求通过,当该请求调用成功,熔断器恢复关闭状态,若该请求失败,继续保持打开状态。
熔断器的开关能保证服务调用者在调用服务异常的时候,快速返回结果,避免了造成客户端大量的同步等待以及大量无效请求影响系统吞吐量,并且熔断器能在一段时间后自动探测请求执行结果,从而有了恢复服务调用的可能。
命令模式
Hystrix使用命令模式(继承自HystrixCommand类)来包裹具体的服务调用逻辑(run方法),并在命令模式中添加了服务调用失败后的降级逻辑(getFallback),同时也可以在Command的构造方法中定义当前服务线程池和熔断器的相关参数。
3.2、Hystrix的应对措施
- 把每个依赖进行隔离,对依赖的调用全部包装成HystrixCommand或者HystrixObservableCommand
- 对依赖的调用耗时设置阈值,超过阈值直接判定超时
- 对每个依赖维护一个连接池,如果连接池满直接拒绝访问
- 评估服务模块的健康状态,超过指定的阈值的话直接熔断处理,对依赖的请求访问直接fallback处理(由开发者自己实现)
- 熔断生效后,时间窗后放出一个请求探测,决定是否要恢复服务
- 近乎实时生效
3.3、Hystrix的内部处理逻辑
- 构建Hystrix的Command对象, 调用执行方法.
- Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.
- 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.
- 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.
- 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
- 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
- 若服务执行成功, 返回正常结果.
- 若服务降级方法getFallback执行成功, 则返回降级结果.
- 若服务降级方法getFallback执行失败, 则抛出异常
【Spring Cloud】服务容错保护:Hystrix(四)的更多相关文章
- spring cloud 服务容错保护 - Hystrix
1.为什么要断路器 在微服务架构中通常会涉及到多个服务间调用,处于调用链路底层的基础服务故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供 ...
- Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】
Spring Cloud(四):服务容错保护 Hystrix[Finchley 版] 发表于 2018-04-15 | 更新于 2018-05-07 | 分布式系统中经常会出现某个基础服务不可用 ...
- Spring Cloud (8) 服务容错保护-Hystrix依赖隔离
依赖隔离 docker使用舱壁模式来实现进程的隔离,使容器与容器之间不会互相影响.而Hystrix则使用该模式实现线程池的隔离,它会为每一个Hystrix命令创建一个独立的线程池,这样就算在某个Hys ...
- 白话SpringCloud | 第五章:服务容错保护(Hystrix)
前言 前一章节,我们知道了如何利用RestTemplate+Ribbon和Feign的方式进行服务的调用.在微服务架构中,一个服务可能会调用很多的其他微服务应用,虽然做了多集群部署,但可能还会存在诸如 ...
- Spring Cloud (7) 服务容错保护-Hystrix服务降级
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以互相调用,在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务通常会集群 ...
- Spring Cloud (9) 服务容错保护-Hystrix断路器
断路器 断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中又电路发生短路时,断路器能够及时的切断故障电路,放置发生过载.发热.甚至起火等严重后果. 在分布式架构中,断路器模式的作用也是类似, ...
- SpringCloud开发学习总结(五)—— 服务容错保护Hystrix
在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式相互依赖.但由于每个单元都在不同的进程中运行,一来通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身 ...
- 服务容错保护hystrix
灾难性雪崩效应 如何解决灾难性雪崩效应 降级 超时降级.资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据.实现一个 fallback 方法, 当请求后端服务出现异常的时候, 可以使用 ...
- spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护
在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖.但是如果有一些服务出现问题了会怎么样? 比如说有三个服务(ABC),A调用B,B调用C.由于网络延迟或C ...
- 【Dalston】【第四章】容错保护(Hystrix)
我们在实践微服务架构时,通常会将业务拆分成一个个微服务,微服务之间通过网络进行通信,进行互相调用,造成了微服务之间存在依赖关系.我们知道由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如 ...
随机推荐
- sql字段为逗号分开的字符串值的关联查询
1.TREE表: [strID] [int] IDENTITY(1,1) NOT NULL,[strName] [nvarchar](50) NOT NULL, 2.SubInfo CREATE TA ...
- Splitting into digits CodeForce#1104A
题目链接:Splitting into digits 题目原文 Vasya has his favourite number
- 在vue项目中使用less
1.安装 less 和 less-loader. 命令: npm install less less-loader --save-dev 2.打开 build/webpack.ba ...
- Microsoft Visual C++ 14.0 is required,成功解决这个问题!
这个问题我向大家也不一定很好解决的,因为按照这个链接提示的打开,里面的t[mark][/mark]ools 页面早就已经不存在了,我也是看了网上各种各样的解决办法,解决起来是困难,这个提示的意思是缺少 ...
- Python 编译器与解释器
Python 编译器与解释器 Python的环境我们已经搭建好了,可以开始学习基础知识了.但是,在此之前,还要先说说编译器与解释器相关的内容. 如果这部分内容,让你觉得难以理解或不能完全明白,可以暂时 ...
- electron教程(一): electron的安装和项目的创建
我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(二): http服务器, ws服务器, 进程管理 electron教程(三): 使 ...
- Spring boot 梳理 - 配置eclipse集成maven,并开发Spring boot hello
@RestController @EnableAutoConfiguration public class App { @RequestMapping("/hello") publ ...
- zookeeper 都有哪些使用场景?
面试题 zookeeper 都有哪些使用场景? 面试官心理分析 现在聊的 topic 是分布式系统,面试官跟你聊完了 dubbo 相关的一些问题之后,已经确认你对分布式服务框架/RPC框架基本都有一些 ...
- Spring Environment的加载
这节介绍environment,默认环境变量的加载以及初始化. 之前在介绍spring启动过程讲到,第一步进行环境准备时就会初始化一个StandardEnvironment.下图为Environm ...
- 夯实Java基础系列14:深入理解Java枚举类
目录 初探枚举类 枚举类-语法 枚举类的具体使用 使用枚举类的注意事项 枚举类的实现原理 枚举类实战 实战一无参 实战二有一参 实战三有两参 枚举类总结 枚举 API 总结 参考文章 微信公众号 Ja ...