1.系统设计:
两台server,server A 用来做任务管理调度,开启一个socket server,监听12345端口
server B 是django web server,页面上控制 tcp client 发送协议命令到 server A管理任务
2.问题:
使用runserver 测试的时候tcp连接一直是正常的,但是生产上使用nginx uwsgi部署的时候发现,客户端(django server)有的时候发送命令过去,服务器端进程recv 接受不到,客户端报错timeout,但是从wireshark转包上可以看到,多发送几次就偶尔能成功
3.pcap
1)客户端发送
2)服务器正常接受 返回
4.代码
客户端:
def check_all_status(self):
try:
data={
"cmd": "check_all_status"
}
CSysLog.info('before send')
self.client.send(json.dumps(data).encode('utf-8'))
CSysLog.info('before recv')
ret = self.client.recv(self.BUFSIZ)
CSysLog.info('receive data')
print 'check task status,ret', ret
return json.loads(ret)
except Exception,e:
CSysLog.error('%s',str(e))
return False
服务端:
while True:
CSysLog.info('waiting for connection')
tcpClientSock, addr = sock.accept()
CSysLog.info('connect from %s', str(addr))
while True:
try:
data = tcpClientSock.recv(BUFSIZ)
except Exception, e:
print(e)
tcpClientSock.close()
break
if not data:
break
异常的时候客户端send 之后就跳到异常了,time out
截图可以看到前两次客户端发送的同样的请求(93b)服务器端没有数据返回,有没有大神指点下是哪里的问题?再次强调,runserver 一直是好的。。。。有没有可能服务器这边会有TCP粘包?不太懂,谢了
具体原因没找到,使用gunicorn部署后没有此问题了,
--应该根gunicorn uwsgi没关系,仔细看了下代码,前端有一处ajax的异步调用,会导致服务器连续发两条tcp的消息,这样应该时导致了socket server接收端有了tcp粘包(wiershark是抓不到的)。runserver 是好的估计是根服务器处理能力有关。。。
改成异步调用,或者修改协议添加长度头都可以解决此问题