我有一个使用Undertow的Spring-boot服务,其主要客户端是客户端站点(约250个此类设备)上的传感器。这些传感器每隔10秒钟通过站点WiFi发送POST到服务-在某些地方有些不可靠。我正在NewRelic中跟踪服务,偶尔会看到长度为HOURS的请求-响应时间(典型的响应时间是几十毫秒)。服务的控制器上没有任何处理-所有有效负载都在线程外缓存并通过单独的进程转发。大约15个小时后,服务停止响应,需要重新启动。我怀疑这些长时间运行的请求会饱和用于处理来自其他传感器的请求的线程池。 NewRelic建议遇到的所有错误都与以下内容非常相似:
I/O error while reading input message; nested exception is java.io.IOException:
UT000128: Remote peer closed connection before all data could be read
这些错误中有很大比例的消息提示在Spring-boot JSON处理器中出现异常,抱怨无效/意外字符或封闭的输入。
似乎似乎有些传感器正在努力完成其POST。这是公平的解释吗?
有没有一种方法可以强迫我的服务在这些请求耗尽我的所有处理程序线程之前“杀死”这些请求?我知道客户端断路器可能是处理此问题的最佳方法,但是我对此事还没有太多控制权。
我也不愿意作为Servlet容器与Undertow结合-Tomcat或Jetty对我来说就很好了,只要它可以使这只猫的皮肤变得容易一些。
我在@Configuration
类中有以下代码:
@Bean
public ServletWebServerFactory servletWebServerFactory() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory(contextPath, serverPort);
factory.addBuilderCustomizers((builder) -> {
...
builder.setServerOption(UndertowOptions.IDLE_TIMEOUT, 60000);
...
});
return factory;
}
但是它似乎并不能终止请求。
答案 0 :(得分:0)
此错误在以下情况下发生(B面)。
A --call-> B
总是在B服务中发生高流量会导致错误。
所以工作在这里
server.undertow.worker-threads 300
high_water:默认值1000000 低水位:默认1000000