我在两台服务器上运行Spring Boot应用程序。它通过Controller从1000个IOT设备接受文件上传请求(约1 KB)。
此外还有一个 TCP侦听器,它也可以从这些物联网设备接收GPS数据作为流。
我已在一台服务器上将Tomcat最大线程数设置为3000,在较大的VM上设置为5000。
一两天后,我的Spring Boot应用程序冻结,即它停止响应任何进一步的API调用。
有一个原因,我怀疑在发送数据后,IOT设备没有关闭 TCP套接字连接。
我哪里可能出错?我的线程用完了处理新的传入请求?
############################
编辑1:
在Socket连接和关闭期间调查线程转储并添加日志之后,我发现IOT设备没有关闭连接。相反,设备每次想要发送新数据时都会创建一个新连接而不关闭前一个数据。
在应用程序冻结之前,22500个打开的连接自动关闭。
我该如何处理这种行为?我应该在一定的超时后强行关闭连接吗?
答案 0 :(得分:1)
您可以通过将服务隐藏在Nginx或HAProxy后面来缓解空闲连接问题,Nginx或HAProxy会在给定超时后默认关闭空闲连接。
另一种选择是在应用程序属性中设置server.connection-timeout
(请参阅server properties),但这似乎仅适用于HTTP。