十八、Spring cloud :Hystrix原理

一、运行原理
Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。

Hystrix是‘豪猪’,具有自我保护的能力,Hystrix通过如下机制解决雪崩效应。

1、资源隔离:包括线程池隔离和信号量隔离,限制调用分布式的资源使用,某一个调用的服务出现问题不会影响其他的服务调用。
2、降级机制:超值降级,资源不足时(线程或者信号量)降级,降级后可以配合降级接口返回托底数据。
3、融断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率),熔断器触发的快速失败会进行快速修复。
4、缓存:提供了请求缓存,请求合并的实现

名词解释:

(1)线程池隔离模式:使用一个线程池来存储当前请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求先入线程池队列。这种方式要为每个依赖服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)
(2)信号量隔离模式:使用一个原子计数器(或信号量)记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃该类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

熔断:
正常情况下,断路器处于关闭状态(Closed),如果调用持续出错或者超时,电路被打开进入熔断状态(Open),后续一段时间内的所有调用都会被拒绝(Fail Fast),一段时间以后,保护器会尝试进入半熔断状态(Half-Open),允许少量请求进行尝试,如果调用仍然失败,则回到熔断状态;如果调用成功,则回到电路闭合状态;

这里写图片描述

降级
服务降级的目的是保证上游的服务的稳定性,当整体资源块不够了,将某些服务先关掉,待度过难关,再开启回来。

根据业务场景的不同,一般采用一下两种模式:
第一种:最常用的–如果服务失败,则通过fallback进行降级,返回静态值。
这里写图片描述
第二种:服务级联模式–如果第一个服务失败,则调用备用服务,例如失败重试或者访问缓存失败再去取数据库,服务级联的目的则是尽最大努力,保证返回数据的成功性,但是如果考虑不充分,则有可能导致级联的服务奔溃(比如,缓存失败了,把全部流量打到数据库,瞬间导致数据库挂了),因此级联模式,也要慎用,增加管理难度
这里写图片描述

二、调度过程
参考地址:https://github.com/Netflix/Hystrix/wiki/How-it-Works
这里写图片描述
1、创建一个HystrixCommand或HystrixObservableCommand实例来向其组件发出操作请求,通过构造方法来创建实例
HystrixCommand:返回一个单个的响应
HystrixObservableCommand:返回一个观察者发出的响应
2、执行方法
这里有四个方法,前两个只适用于HystrixCommand 不适用于HystrixObservableCommand
execute():阻塞型方法,返回单个结果(或者抛出异常)
queue():异步方法,返回一个Future对象,可以从中取出单个结果(或者抛出异常)
observe():返回Observable对象
toObservable():返回Oberservable对象
3、缓存判断
检查缓存内是否有对应的指令结果,如果有的话,将缓存的结果直接以Observable对象的形式返回
4、断路器判断
检查Circuit Breaker的状态,如果Circuit Breaker的状态为开启状态,Hystrix将不会执行对应的命令,而是直接进入失败处理状态(如上图中的8).如果Circuit Breaker的状态为关闭状态,Hystrix会继续执行(如上图5)
5、线程池、任务队列、信号量的检查
确认是否有足够的资源执行操作指令,当线程池和队列(或者信号量,当不使用线程池隔离模式的时候)资源满的时候,Hystrix将不会执行对应的指令并且会直接进入失败处理状态(如上图中的8)
6、HystrixObservableCommand.construct() 和 HystrixCommand.run()
如果资源充足,Hystrix将会执行操作指令,操作指令的调用最终会到这两个方法:
HystrixCommand.run():返回一个响应或者抛出一个异常
HystrixObservableCommand.construct():返回一个可观测的发出响应(s)或发送一个onError通知
7、统计断路器的健康状况
Hystrix会根据记录的数据来计算失败比率,一旦失败比率达到某一阀值将将自动打开Circuit Breaker
8、回退
如果我们在Command中实现了HystrixCommand.getFallback()方法或者(HystrixObservableCommand. resumeWithFallback() 方法)Hystrix会返回对应方法的结果。如果没有实现这些方法的话,仍然 Hystrix会返回一个空的 Observable 对象,并且可以通过 onError 来终止并处理错误。
调用不同的方法返回不同的结果:
execute(): 将会抛出异常
queue(): 将会返回一个Future 对象,如果调用它的get()方法将会抛
出异常
observe()和 toObservable():都会返回上述的 Observable对象
9**重点内容**、 返回成功

如果Hystrix执行成功,返回的响应取决于在步骤2中调用命令。

execute():阻塞型方法,返回单个结果(或者抛出异常)

queue():异步方法,返回一个 Future 对象,可以从中取出单个结果(或者抛出异常)

observe():返回Observable 对象

toObservable():返回Observable 对象

断路器开启或者关闭的条件:

1、 当满足一定的阀值的时候(默认10秒内超过20个请求次数)

2、 当失败率达到一定的时候(默认10秒内超过50%的请求失败)

3、 到达以上阀值,断路器将会开启

4、 当开启的时候,所有请求都不会进行转发

5、 一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值