1、hystrix执行时的内部原理
注意点:超时后,也不可能终止掉一个调用严重延迟的依赖服务的线程的,只能说给你抛出来一个TimeoutException,但是还是可能会因为严重延迟的调用线程占满整个线程池。
2、两个command
HystrixCommand、HystrixObservableCommand
3、调用command的执行方法
execute(),queue(),observe(),toObservable()。
1)execute():调用后直接block,同步调用,直到依赖服务返回单条结果,或者抛出异常。
2)queue():返回一个Future,异步调用,后面可以通过Future获取单条结果。
3)observe():立即去执行construct方法,拿到多行的结果。
4)toObservable():返回一个Observable对象,后面对该对象调用subscribe方法去订阅
时才会触发底层的construct方法。
4、fallback降级机制场景
1)run()或construct()抛出一个异常
2)短路器发现异常占据一定的比例,直接开启短路。
3)线程池/队列/semaphore满了
4)command执行超时
5、fallback为空或者异常时的返回结果
1)对于execute(),直接抛出异常
2)对于queue(),返回一个Future,调用get()时抛出异常
3)对于observe(),返回一个Observable对象,但是调用subscribe()方法订阅它时,立即抛出调用者的onError方法
4)对于toObservable(),返回一个Observable对象,但是调用subscribe()方法订阅它时,立即抛出调用者的onError方法
6、请求缓存
注:一次请求、filter、请求上下文
两种最经典的降级机制
纯内存数据替代,默认值
降级本身的限流
fallback.isolation.semaphore.maxConcurrentRequests
这个参数设置了HystrixCommand.getFallback()最大的并发请求数量,默认是10,通过semaphore信号量的机制。如果超出了,直接被reject
HystrixCommandProperties.Setter()
.withFallbackIsolationSemaphoreMaxConcurrentRequests(int value)
断路器的几个参数
1)短路器的流量超过了一定的阈值,才会考虑
circuitBreakerRequestVolumeThreshold
2)统计到的异常调用的占比阈值
circuitBreakerErrorThresholdPercentage
3)进入half-open的时间
circuitBreakerSleepWindowInMilliseconds
4)控制短路器是否允许工作,默认是true
circuitBreaker.enabled
5)时间窗口
requestVolumeThreshold
6)
errorThresholdPercentage
总结
1、线程池隔离,学术名称:bulkhead,舱壁隔离
2、semaphore隔离,底层网络调用延迟严重时,是无法timeout的,只能一直block住