netflix的工作流程图解析中

一 工作流程

二 断路器是否打开

当命令结果没有在缓存中命中,Hystrix在执行命令前需要检查断路器是否为打开状态:

  • 如果断路器是打开的,那么Hystrix不会执行命令,而是转接到fallback处理逻辑。

  • 如果断路器是关闭的,那么Hystrix将继续往下执行,检查是否有可用资源来执行命令。

三 线程池/请求队列/信号量是否占满

如果与命令相关的线程池和请求队列,或者信号量(不使用线程池的时候)已经被占满,那么Hystrix也不会执行命令,而是转接到fallback处理逻辑。

这里Hystrix所判断的线程池并非容器的线程池,而是每个依赖服务的专有线程池。为了保证不会因为某个依赖服务的问题影响到其他依赖服务而采用了“舱壁模式”来隔离每个依赖的服务。

四 HystrixObservableCommand.construct()或HystrixCommand.run()

Hystrix会根据编写的方法来决定采取什么样的的方式去请求依赖服务。

HystrixCommand.run():返回一个单一结果,或者抛出异常。

HystrixObservableCommand.construct():返回一个Observable对象来发射多个结果,或通过OnError发送错误通知。

如果run()或construct()方法执行时间超过了命令设置的超时阈值,当前线程将会抛出一个TimeoutException。这时,Hystrix会转接到fallback处理逻辑,同时,如果当前命令没有被取消或中断,那么它最终会忽略run()或construc()方法的返回。

如果命令没有抛出异常,那么Hystrix在记录一些日志并采集监控报告之后将返回结果。在使用run()的情况下,Hystrix在记录一些日志并采集监控报告之后将该结果返回。在使用run()的情况下,Hystrix会返回一个Observable,它发射单个结果并产生onCompleted的结束通知;而在使用construct()的情况下,Hystrix会直接返回该方法产生的Observable对象。

五 计算断路器的健康度

Hystrix会将“成功”、“失败”、“拒绝”、“超时”等信息报告给断路器,而断路器会维护一组计数器来统计这些数据。

断路器会使用这些数据来决定是否要将断路器打开,来对某个依赖服务的请求进行“熔断/断路”,直到恢复期结束。若在恢复期结束后,根据统计数据判断如果还是没有达到健康状态,就再次“熔断/断路”。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/81407152