Hystrix与Ribbon超时警告问题:配置值为何翻倍?
问题解答
哎,这个问题我之前排查过,其实是Ribbon默认的重试配置在“暗中”影响超时计算!
为什么警告里的总和是40000ms?
你可能以为Ribbon的超时就是ConnectTimeout + ReadTimeout的20000ms,但Hystrix的超时检查逻辑会把Ribbon的默认重试次数也算进去——哪怕你没引入spring-retry依赖,它依然会用Ribbon的默认重试参数来计算理论上的最大超时时间。
具体的计算逻辑是这样的:总超时时间 = (连接超时 + 读取超时) × (同一实例重试次数 + 1) × (切换实例重试次数 + 1)
对照你的配置和Ribbon默认值:
- 单实例单次请求超时:
5000 + 15000 = 20000ms - Ribbon默认
MaxAutoRetries(同一实例重试次数)是1,MaxAutoRetriesNextServer(切换到下一个实例的重试次数)是1
把数值代入公式:20000 × (1+1) × (1+1) = 20000 × 2 × 2 = 40000ms
这就是警告里显示40000ms的原因啦。
怎么解决这个警告?
给你两个实用的方案:
- 调整Hystrix超时时间:把Hystrix的超时设置成大于等于40000ms,让它覆盖Ribbon可能的最大重试超时:
hystrix.command.serviceA.execution.isolation.thread.timeoutInMilliseconds = 40000 - 关闭Ribbon重试:如果你的场景不需要重试,直接把重试次数设为0,这样总超时就会回到20000ms,和你当前的Hystrix超时匹配:
serviceA.ribbon.MaxAutoRetries=0 serviceA.ribbon.MaxAutoRetriesNextServer=0
划个重点:哪怕没有spring-retry依赖,Ribbon的默认重试配置还是会被Hystrix的检查逻辑算进去,所以要么跟着调整Hystrix超时,要么显式关掉重试就行。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

