【SpringCloud系列】 深入Hystrix底层执行流程(2)

508 阅读2分钟

深入Hystrix底层执行流程

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

接着上一篇文章 【SpringCloud系列】 深入Hystrix底层执行流程(1)

5. 检查线程池/队列/信号量是否已满

如果command线程池和队列已满,或者semaphore信号量已满,不会执行command,而直接去调用fallback降级机制,同时发送reject信息给断路器统计.

6.执行command

调用HystrixCommand的run()方法或HystrixObservableCommand对象的construct()方法来实际执行command

7.断路健康检查

Hystrix把每一个依赖服务的调用成功、失败、Reject、Timeout等事件发送给circuit breaker器,断路器就会对这些事件的次数进行统计,根据异常事件发生的比例*(5s异常次数20次开启断路器)来决定是否要进行断路(熔断),如果打开了断路器,那么在一段时间内会直接断路,返回降级结果。

8.调用fallback降级机制

HystrixCommand中,实现getFallback()方法,可提供降级机制 HystrixObservableCommand中,实现resumeWithFallback()方法,返回一个Observable对象,可提供降级结果。 如果没有实现fallback,或者fallback抛出了异常,Hystrix会返回一个Observable,但是不会返回任何数据。

在以下几种场景,Hystrix会调用fallback降级机制

  • 断路器处于打开状态
  • 线程池/队列/semaphore满了
  • command执行超时
  • run()或者construct()抛出异常 在降级机制中,建议返回默认的结果,比如静态代码逻辑,或者从内存的缓存中提取数据,尽量不进行网络请求。

不同的command执行方式,其fallback为空或者异常时的返回结果不同

  • 对于execute(),直接抛出异常
  • 对于queue(),返回一个Future,调用get()时抛出异常
  • 对于observe(),返回一个Observable对象,但是调用subscribe()方法订阅它时,立即抛出调用者的onError()方法。
  • 对于toObservable(),返回一个Observable对象,但是调用subscribe()方法订阅它时,立即抛出调用者的onError()方法。

不同的执行方式

  • execute():获取一个Future.get(),拿到单个结果
  • queue():返回一个Future
  • observe():立即订阅Observable,然后启动8大执行步骤,返回一个拷贝的Observable,订阅时立即回调返回结果。
  • toObservable():返回一个原始的Observable,必须手动订阅去执行8大步骤。