隔离方式 | 是否支持超时 | 是否支持熔断 | 隔离原理 | 是不是异步调用 | 资源消耗 |
线程池隔离 | 支持,可直接返回 | 支持,当线程池到达maxSize后,再请求会触发fallback接口进行熔断 | 每一个服务单独用线程池 | 能够是异步,也能够是同步。看调用的方法 | 大,大量线程的上下文切换,容易形成机器负载高 |
信号量隔离 | 不支持,若是阻塞,只能经过调用协议(如:socket超时才能返回) | 支持,当信号量达到maxConcurrentRequests后。再请求会触发fallback | 经过信号量的计数器 | 同步调用,不支持异步 |
小,只是个计数器html |
- 引自官网java
自我理解:git
每次调用线程,当前请求经过计数信号量进行限制,当信号大于了最大请求数(maxConcurrentRequests)时,进行限制,调用fallback接口快速返回。github
最重要的是,信号量的调用是同步的,也就是说,每次调用都得阻塞调用方的线程,直到结果返回。这样就致使了没法对访问作超时(只能依靠调用协议超时,没法主动释放)网络
官网对信号量隔离的描述建议app
HystrixCommand
s is when the call is so high volume (hundreds per second, per instance) that the overhead of separate threads is too high; this typically only applies to non-network calls.理解下两点:异步
经过每次都开启一个单独线程运行。它的隔离是经过线程池,即每一个隔离粒度都是个线程池,互相不干扰socket
线程池隔离方式,等于多了一层的保护措施,能够经过hytrix直接设置超时,超时后直接返回。this
之前对zuul网关的一个误解,觉得网关用的是线程池隔离是属于异步调用的,觉得只要用了线程池隔离,不须要去考虑自己具体的线程池大小了。spa
具体看源码:
调用的是hytrix command的excute方法,hytrix的官网原文说明以下:
execute()
— blocks, then returns the single response received from the dependency (or throws an exception in case of an error)
execute是一个阻塞方法,也就是说,若是不合理的设置线程池的大小,和超时时间,仍是有可能把zuul的线程消耗完。从而失去对服务的保护做用
公众号:
何锦彬 2018.09.21