Hystrix 和 Ribbon 超时警告
Hystrix & Ribbon Timeout Warnings
环境
- Spring 引导 1.5.13.RELEASE
- Spring Cloud Edgware.SR3
- 使用 Java 版本“1.8.0_172-ea”、Java(TM) SE 运行时环境(build 1.8.0_172-ea-b03)和源代码级别 1.8 编译
- 运行时 JRE:在 docker 和
openjdk:10.0.1-jre-slim
中
问题
我有一个名为 serviceA
的功能区客户端并关联了
serviceA.ribbon.ConnectTimeout=5000
serviceA.ribbon.ReadTimeout=15000
hystrix.command.serviceA.execution.isolation.thread.timeoutInMilliseconds = 20000
我没有(有意地)spring-在类路径上重试。我执行 ./mvnw dependency:list | grep -i retry
但没有得到任何结果。
在运行时我收到这些警告:
The Hystrix timeout of 20000ms for the command serviceA is set lower than the combination of the Ribbon read and connect timeout, 40000ms.
我不确定这些数字是从哪里来的,因为我认为我会分别将它们设置为 15 秒和 5 秒。为什么这个数字是两倍?
实际上,ribbon 超时包括所有相同的服务器重试和下一个服务器重试。
ribbonTimeout = (ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1);
// ...
if(hystrixTimeout < ribbonTimeout) {
LOGGER.warn("The Hystrix timeout of " + hystrixTimeout + "ms for the command " + commandKey +
" is set lower than the combination of the Ribbon read and connect timeout, " + ribbonTimeout + "ms.");
}
在您的配置中:
- ribbon.connectionTimeout 是 5000
- ribbon.readTimeout 是 15000
- ribbon.maxAutoRetries 为 0(默认)
- ribbon.maxAutoRetriesNextServer 为 1(默认)
所以 hystrixTimeout 应该是:
(5000 + 15000) * (1 + 0) * (1 + 1) // -> 40000 ms
如果您选择不配置 Hystrix 超时,则默认的 Hystrix 超时将为 40000 毫秒。
环境
- Spring 引导 1.5.13.RELEASE
- Spring Cloud Edgware.SR3
- 使用 Java 版本“1.8.0_172-ea”、Java(TM) SE 运行时环境(build 1.8.0_172-ea-b03)和源代码级别 1.8 编译
- 运行时 JRE:在 docker 和
openjdk:10.0.1-jre-slim
中
问题
我有一个名为 serviceA
的功能区客户端并关联了
serviceA.ribbon.ConnectTimeout=5000
serviceA.ribbon.ReadTimeout=15000
hystrix.command.serviceA.execution.isolation.thread.timeoutInMilliseconds = 20000
我没有(有意地)spring-在类路径上重试。我执行 ./mvnw dependency:list | grep -i retry
但没有得到任何结果。
在运行时我收到这些警告:
The Hystrix timeout of 20000ms for the command serviceA is set lower than the combination of the Ribbon read and connect timeout, 40000ms.
我不确定这些数字是从哪里来的,因为我认为我会分别将它们设置为 15 秒和 5 秒。为什么这个数字是两倍?
实际上,ribbon 超时包括所有相同的服务器重试和下一个服务器重试。
ribbonTimeout = (ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1);
// ...
if(hystrixTimeout < ribbonTimeout) {
LOGGER.warn("The Hystrix timeout of " + hystrixTimeout + "ms for the command " + commandKey +
" is set lower than the combination of the Ribbon read and connect timeout, " + ribbonTimeout + "ms.");
}
在您的配置中:
- ribbon.connectionTimeout 是 5000
- ribbon.readTimeout 是 15000
- ribbon.maxAutoRetries 为 0(默认)
- ribbon.maxAutoRetriesNextServer 为 1(默认)
所以 hystrixTimeout 应该是:
(5000 + 15000) * (1 + 0) * (1 + 1) // -> 40000 ms
如果您选择不配置 Hystrix 超时,则默认的 Hystrix 超时将为 40000 毫秒。