我有一个python2.7 Socketserver,它通过拥塞的本地网络响应请求。 (想想运行所述python服务器的计算机集群是通过交换机与单个控制器通信的。)
TCP连接的另一端是一个NodeJS应用程序,它充当服务器的客户端。
大约出现此问题。 1/1000个请求,看似随机。 NodeJS客户端将报告“ ECONNRESET”错误,但是大部分时间都收到了所有数据。在收到所有数据之前,将抛出大约1/10的错误“ ECONNRESET”。
经过大量调查,我发现问题出在SocketServer。我尝试使用C客户端和Python客户端,并且都报告了相同错误的版本。
我还发现(请参见下面的代码)在套接字服务器中,如果我在所有写入之后但在handle函数内返回之前放置“ sleep(0.25)”,则不再发生此错误。 (经过约3,000,000次运行测试)。
这使我相信与套接字服务器存在一些奇怪的交互作用,从而迫使连接关闭,但是较早的数据包之一需要重新传输,或者类似的方式,但是套接字服务器上的文档相当合理点亮。
from time import sleep
import SocketServer
class ThreadedServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
class ThreadedRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
req = parseRequest()
res = processRequest()
self.request.send(res)
sleep(0.25)
return
def main():
server = ThreadedServer((parameters.HOST, server_port), ThreadedRequestHandler)
server.serve_forever()
if __name__ == "__main__":
main()
我当然已经删除了业务逻辑,但是问题围绕发送之后的睡眠问题。有了它,没有问题,没有它,有时会出现意外的服务器关闭/未发送最后一个数据包。这使我相信这与丢弃的数据包和服务器强制关闭有关,但是可能与其他原因有关。
任何帮助将不胜感激,如果不清楚,我可以澄清。