项目中出现了设置了hystrix超时时间,依旧很快就发生了超时异常的状况。java
You can use semaphores (or counters) to limit the number of concurrent calls to any given dependency, instead of using thread pool/queue sizes. This allows Hystrix to shed load without using thread pools but it does not allow for timing out and walking away. If you trust the client and you only want load shedding, you could use this approach.
官方文档里面指出使用信号量,没法设置超时。app
而咱们的项目中有出现,存在超时时间和信号量同时配置的状况。这个时候配置超时时间是不起效的。this
设置了隔离隔离策略是SEMAPHORE
,仍是出现了超时现象。
spa
通过排查是ribbon超时。ribbon.ConnectTimeout
和 ribbon.ReadTimeout
默认超时时间都只有1000毫秒。code
// ribbon的超时时间计算 ribbonTimeout = (ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1)
hystrixTimeout要大于ribbonTimeout,不然hystrix
熔断了之后,ribbon
的重试就都没有意义了。而当feign设置了超时时间,Ribbon
会依据feign
的connectTimeout
设置同步。blog
因此正确的超时时间设置应该是:ci
hystrixTimeout > ribbonTimeout
。feignConnectTimeout > ribbonTimeout