Workerman不能清除所有在memcached的客户端连接信息

wudihzh

使用Workerman 2的Gateway/Worker模式进行项目开发,使用“DBIOCP协议回射客户端”进行并发连接测试时,当连接数为10000,保持长连接一段时间,在客户端停止连接(同时10000个停止),发现有时候workerman并不能清除所有在Memcached中保存的客户端信息(以global_client_id作Key),导致判断客户连接数不正确,请问这可能是什么原因?
同时停止时有时会引起如下异常,但是出现下面的异常时也不一定会出现上面的现象:

Gateway::CMD_SEND_TO_ONE    code:121    msg:exception 'Exception' with message '发送数据到客户端失败,可能是该客户端的发送缓冲区已满,或者客户端已经下线' in /lian/workerman/applications/Phone/Bootstrap/Gateway.php:563
Stack trace:
#0 /lian/workerman/applications/Phone/Bootstrap/Gateway.php(519): Gateway->innerDealProcess('???(?????????{...')
#1 : Gateway->recvInnerTcp(Resource id #76, 2, 76)
#2 /lian/workerman/workerman/Core/Events/Libevent.php(132): event_base_loop(Resource id #51)
#3 /lian/workerman/applications/Phone/Bootstrap/Gateway.php(235): Man\Core\Events\Libevent->loop()
#4 /lian/workerman/workerman/Core/Master.php(479): Gateway->start()
#5 /lian/workerman/workerman/Core/Master.php(391): Man\Core\Master::createOneWorker('Gateway')
#6 /lian/workerman/workerman/Core/Master.php(198): Man\Core\Master::spawnWorkers()
#7 /lian/workerman/workerman/bin/workermand(111): Man\Core\Master::run()
#8 {main}***

请问该如何避免?

3592 1 0
1个回答

walkor 打赏

发现有时候workerman并不能清除所有在Memcached中保存的客户端信息(以global_client_id作Key),导致判断客户连接数不正确,请问这可能是什么原因?

可能客户端连接断开时由于某种原因没有发送fin包导致workerman没有检测到连接断开,可以让客户端定时向workerman发送心跳,workerman设置多久没收到心跳自动踢出(具体设置参考手册),可以解决这种异常情况。

另外判断客户端连接数请使用 Gateway::getOnlineStatus接口,此接口返回的数据是真实的Workeman的Gateway客户端连接数据

关于异常,原因在异常信息里面有提到,可能是该客户端的发送缓冲区已满,或者客户端已经下线

可能时在给客户端发送数据的同时,客户端断开了连接,或者workerman给客户端发送数据时,发现客户端连接已经断开,此类异常不会对系统有任何影响,可以忽略。

  • 暂无评论
年代过于久远,无法发表回答
×
🔝