使用Workerman 2的Gateway/Worker模式進行項目開發(fā),使用“DBIOCP協(xié)議回射客戶端”進行并發(fā)連接測試時,當連接數(shù)為10000,保持長連接一段時間,在客戶端停止連接(同時10000個停止),發(fā)現(xiàn)有時候workerman并不能清除所有在Memcached中保存的客戶端信息(以global_client_id作Key),導致判斷客戶連接數(shù)不正確,請問這可能是什么原因?
同時停止時有時會引起如下異常,但是出現(xiàn)下面的異常時也不一定會出現(xiàn)上面的現(xiàn)象:
Gateway::CMD_SEND_TO_ONE code:121 msg:exception 'Exception' with message '發(fā)送數(shù)據(jù)到客戶端失敗,可能是該客戶端的發(fā)送緩沖區(qū)已滿,或者客戶端已經(jīng)下線' 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}***
請問該如何避免?
發(fā)現(xiàn)有時候workerman并不能清除所有在Memcached中保存的客戶端信息(以global_client_id作Key),導致判斷客戶連接數(shù)不正確,請問這可能是什么原因?
可能客戶端連接斷開時由于某種原因沒有發(fā)送fin包導致workerman沒有檢測到連接斷開,可以讓客戶端定時向workerman發(fā)送心跳,workerman設置多久沒收到心跳自動踢出(具體設置參考手冊),可以解決這種異常情況。
另外判斷客戶端連接數(shù)請使用 Gateway::getOnlineStatus接口,此接口返回的數(shù)據(jù)是真實的Workeman的Gateway客戶端連接數(shù)據(jù)
關于異常,原因在異常信息里面有提到,可能是該客戶端的發(fā)送緩沖區(qū)已滿,或者客戶端已經(jīng)下線
可能時在給客戶端發(fā)送數(shù)據(jù)的同時,客戶端斷開了連接,或者workerman給客戶端發(fā)送數(shù)據(jù)時,發(fā)現(xiàn)客戶端連接已經(jīng)斷開,此類異常不會對系統(tǒng)有任何影響,可以忽略。