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