英文:
io.netty.handler.timeout.ReadTimeoutException: null error on AWS
问题
We are experiencing the strangest problem. We are using WebFlux WebClient to make an API call. It was working fine, and then last week we started seeing the intermittent error:
io.netty.handler.timeout.ReadTimeoutException: null
To give some background. Our dev server is running on bare metal, and it is stable and has no issues at all. This is only happening in production on our AWS instance.
We see this happening on every second service call, which made me think load balancer, but my infrastructure team cannot see anything obvious.
This is the code that makes the service call.
Mono<String> responseMono = headersSpec.header("X-CORRELATION-ID", correlationId)
.accept(MediaType.APPLICATION_JSON)
.exchangeToMono(response -> {
if (response.statusCode().equals(HttpStatus.OK)) {
return response.bodyToMono(String.class);
} else if (response.statusCode().equals(HttpStatus.BAD_REQUEST)) {
return Mono.error(new DataViolationException("Data rejected","Data rejected",null,"ProductUse.useProduct"));
} else {
return Mono.error(new GeneralServiceException("Error status received: " + response.statusCode().toString() + " [" + response.bodyToMono(String.class) + "]",null));
}
});
I am wondering if it is an issue with our version of Spring? We are running the following:
Java Version: 18
Spring Version: 3.0.5
This application runs on Kubernetes.
Any suggestions would be much appreciated, at a bit of a loss here, have read other posts about this error but still unable to work out why it is happening to us, and why it only happens on AWS and not bare metal.
英文:
We are experiencing the strangest problem. We are using WebFlux WebClient to make an API call. It was working fine, and then last week we started seeing the intermittent error:
io.netty.handler.timeout.ReadTimeoutException: null
To give some background. Our dev server is running on bare metal, and it is stable and has no issues at all. This is only happening in production on our AWS instance.
We see this happening on every second service call, which made me think load balancer, but my infrastructure team cannot see anything obvious.
This is the code that makes the service call.
Mono<String> responseMono = headersSpec.header("X-CORRELATION-ID", correlationId)
.accept(MediaType.APPLICATION_JSON)
.exchangeToMono(response -> {
if (response.statusCode().equals(HttpStatus.OK)) {
return response.bodyToMono(String.class);
} else if (response.statusCode().equals(HttpStatus.BAD_REQUEST)) {
return Mono.error(new DataViolationException("Data rejected","Data rejected",null,"ProductUse.useProduct"));
} else {
return Mono.error(new GeneralServiceException("Error status received: " + response.statusCode().toString() + " [" + response.bodyToMono(String.class) + "]",null));
}
});
I am wondering if it is an issue with our version of Spring? We are running the following:
Java Version: 18
Spring Version: 3.0.5
This application runs on Kubernetes.
Any suggestions would be much appreciated, at a bit of a loss here, have read other posts about this error but still unable to work out why it is happening to us, and why it only happens on AWS and not bare metal.
答案1
得分: 1
以下是已翻译的内容:
让我们详细分析这个问题...
ReadTimeoutException
可能会在指定的超时期内未收到服务器响应时发生。但在您的情况下,由于在生产环境中出现问题,而在开发服务器上没有出现问题,可能是您的AWS实例与外部服务之间存在网络问题。
现在,让我们一起解决这个问题。
-
增加超时时长,看看是否解决了这个问题。您可以使用调试器逐步执行代码,并确定超时发生的位置。这可以让您了解问题是WebClient还是代码中的其他地方。
-
可能存在AWS实例和外部服务之间的网络连接问题。您可以尝试使用PING或TRACEROUTE命令从AWS实例到外部服务进行网络连接测试。
-
您还可以升级到更新版本的Spring和Java。看起来您正在使用较旧版本的Spring和Java,可能存在兼容性问题导致超时。您可以尝试升级到较新版本,看看是否解决了问题。
英文:
Let us break this down extensively...
The ReadTimeoutException
can
occur when there is no response from the server within the specified
timeout period. But in your case, since the issue is happening
consistently on production and not on your development server, it is
possible that there could be a network issue between your AWS
instance and the external service.
Now, let us troubleshoot the problem together.
-
Increase the timeout duration and see if it resolves this issue. You can use a debugger to step through the code and determine where
the timeout is occurring. This can give you an idea of whether the
issue is with the WebClient or somewhere else in your code. -
It is possible that there is an issue with the network connectivity between your AWS instance and the external service. You can try
testing the network connectivity by using PING or TRACEROUTE commands
from the AWS instance to the external service. -
You can as well upgrade to a newer version of Spring and Java. It appears that you are using older versions of Spring and Java, it is
possible that there are compatibility issues that are causing the
timeouts. You can try upgrading to newer versions and see if it
resolves the issue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论