问题描述
Delphi 10.3.1,Indy 10.6.2.5366
我们在REST服务中使用TIdHTTPServer
,而TIdHttpServer
在缓慢使用所有连接时遇到问题。 MaxConnections
是100。
当我们达到100个连接时,没有人可以从该服务获得任何响应。
使用netstat可以看到IP和对等端口,在OnCommandGet
/ OnCommandOther
中,我们正在记录IP和对等端口,但是没有IP /端口与netstat中的IP /端口匹配状态为ESTABLISHED。
但是当我们也开始在OnConnect
中记录IP和对等端口时,我们可以从netstat中看到IP /端口。
所以现在我们认为我们的某些联系陷入了OnConnect
和OnCommandGet
/ OnCommandOther
之间。
并非我们所有的客户都遇到此问题,但是对于某些客户来说,只需要2到10天就可以到达MaxConnections
。
服务的客户是移动设备,因此我们认为建立连接后可能与Internet连接的质量有关!!
我们可以采取一些措施来防止这种情况发生吗?
解决方法
当客户端连接时,将立即触发OnConnect
事件,但是在收到完整的HTTP请求之前不会触发OnCommand...
事件。但是,您绝对应该能够在PeerIP
事件中获得可行的PeerPort
/ OnCommand...
值。
如果您的移动设备的连接稳定性出现问题,则它们可能会异常断开连接的末端,并且服务器的OS可能无法及时对此做出反应。这肯定会导致服务器至少在一段时间内最终会出现一堆死连接。
在OnConnect
事件中,尝试为AContext.Connection.ReadTimeout
属性或AContext.Binding.SetKeepAliveValues()
方法分配一个合理的非无限超时,看看是否对您的问题有所帮助。