SpringCloud服务间调用超时时间不起效

项目中出现了设置了hystrix超时时间,依旧很快就发生了超时异常的状况。java

hystrix的隔离级别设置成了信号量

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

而咱们的项目中有出现,存在超时时间和信号量同时配置的状况。这个时候配置超时时间是不起效的。
image.pngthis

未设置ribbon超时时间

设置了隔离隔离策略是SEMAPHORE,仍是出现了超时现象。
image.png
![d151cd7c3f4f029a6dfdf135ab5d2bfe.png](evernotecid://FD991630-9A29-41DC-9C96-99ADAD4D5D74/appyinxiangcom/13442185/ENResource/p4775)spa

通过排查是ribbon超时。ribbon.ConnectTimeoutribbon.ReadTimeout 默认超时时间都只有1000毫秒。code

// ribbon的超时时间计算
ribbonTimeout = (ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1)

hystrixTimeout要大于ribbonTimeout,不然hystrix熔断了之后,ribbon的重试就都没有意义了。而当feign设置了超时时间,Ribbon会依据feignconnectTimeout设置同步。blog

因此正确的超时时间设置应该是:ci

  • 同时设置ribbon和hystrix的超时时间,且 hystrixTimeout > ribbonTimeout
  • 或者同时设置feign和hystrix的超时时间,且feignConnectTimeout > ribbonTimeout
相关文章
相关标签/搜索