前言
高可用相关的技术以及架构,对于大型复杂的分布式系统,是非常重要的。而高可用架构中,非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而足以应对分布式系统环境中的各种各样的问题,比如服务间的调用超时,或者服务间的调用失败,避免整个分布式系统被某个服务的故障给拖垮。而要解决这些棘手的分布式系统可用性问题,就涉及到了高可用分布式系统中的很多重要的技术,包括资源隔离,限流与过载保护,熔断,优雅降级,容错,超时控制,监控运维,等等。而行业中大部分的朋友,对高可用系统架构以及相关的技术并没有太多的了解,这也成为了你设计一个复杂的高可用系统架构,或者面试高阶Java职位时的一个重要阻碍。
在行业中,实现高可用架构的非常流行和重要的框架就是Hystrix,是国外知名的视频网站Netflix所开源的。Hystrix能够完美的解决分布式系统架构中,打造高可用服务面临的一系列技术难题,包括资源隔离,限流与过载保护,熔断,优雅降级,容错,超时控制,监控运维等等。
断路器-Hystrix的深入了解
工作流程(参考:https://github.com/Netflix/Hystrix/wiki/How-it-Works)
1、 创建一个 HystrixCommand 或 HystrixObservableCommand 实例
第一步就是构建一个 HystrixCommand 或 HystrixObservableCommand 实例来向其它组件发出操作请求,通过构造方法来创建实例。
HystrixCommand:返回一个单响应
HystrixObservableCommand:返回一个观察者发出的响应
2、 执行方法
这里有4个方法,前两个只适用于 HystrixCommand 不适用于 HystrixObservableCommand
execute():阻塞型方法,返回单个结果(或者抛出异常)
queue():异步方法,返回一个 Future 对象,可以从中取出单个结果(或者抛出异常)
- observe():返回Observable 对象
toObservable():返回Observable 对象
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通知
如果执行指令的时间超时,执行线程会抛出 TimeoutException 异常。Hystrix会抛弃结果并直接进入失败处理状态。如果执行指令成功,Hystrix会进行一系列的数据记录,然后返回执行的结果。
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和5。
HystrixCircuitBreaker源码分析
如果是对Hystrix技术感兴趣的话,建议可以参考下这个免费的视频资料,这是一个基于Hystrix技术的高可用架构的项目实战免费课程,课程都是用每日上亿流量的大型电商网站中的商品详情页系统中的缓存服务,作为项目实战。学习地址