Hi,walkor,
目前該問題已是在生產(chǎn)項目上,我在PHP腳本里面直接引用RPCclient.php,然后遠程調(diào)用RPC服務(wù)器往數(shù)據(jù)庫里寫數(shù)據(jù),腳本執(zhí)行完一段時間后發(fā)現(xiàn)腳本的進程退出了,看了一下日志是RPC拋異常了:Uncaught exception 'Exception' with message 'recvData empty',導(dǎo)致腳本進程退出
我有幾點想請問一下:
1,Uncaught exception 'Exception' with message 'recvData empty'是什么原因?qū)е碌??,我看了下代碼是沒有問題的(因為正常跑過一段時間),看了下RPC服務(wù)器中workerman.log中也沒異常日志,
2,遠程請求RPC時,Uncaught exception 'Exception' with message 'recvData empty' 這種異常是不能避免的嗎?
3.如果我有asend_ 異常方法調(diào)用的話,會出現(xiàn)這種異常嗎?如果出現(xiàn)了,但對腳本進程有影響嗎?
謝謝walkor解答!
recvData empty 意思是客戶端發(fā)給服務(wù)端的請求超過5秒還沒有返回結(jié)果,也就是說rpc服務(wù)端處理超時了。
應(yīng)該是rpc的業(yè)務(wù)比較慢導(dǎo)致的。具體為什么慢需要你們自己定位,可能是msyql語句執(zhí)行的慢、可能是curl訪問外部接口慢等等原因。
https://github.com/walkor/workerman-JsonRpc/blob/master/Applications/JsonRpc/Clients/RpcClient.php#L56
超時時間是這里設(shè)置的,超時時間默認是5秒。
asend_ 異常方法調(diào)用的話,如果服務(wù)端超時,也會出現(xiàn)這種異常。
好的 謝謝walkor, 我這邊的業(yè)務(wù)是輪詢新聞消息池,消息池里面有消息的話,就不斷的遠程調(diào)用workerman-RPC,每條傳輸?shù)臄?shù)據(jù)大約3k左右,昨天我換了asend_ 異部調(diào)用,今天查看了下Log日志,發(fā)現(xiàn)WORKER EXIT UNEXPECTED E_ERROR Allowed memory size of 335544320 bytes exhausted (tried to allocate 65536 bytes),允許的內(nèi)存用盡了,是不是asend_異常不適合這種大量請求的業(yè)務(wù)場景? 調(diào)用RPC的時候是不是發(fā)送數(shù)據(jù)不宜過大?
是的 內(nèi)存滿了,walkor ,我找到原因在哪里了,是因為腳本不斷通過異常方式asend_ 遠程調(diào)用RPC服務(wù)導(dǎo)致連接數(shù)(connections)不斷增加導(dǎo)致的,我在測試機上測試了一下,把RPC服務(wù)里面被調(diào)用的方法的業(yè)務(wù)全部注釋掉了,只留一個空方法,結(jié)果還是一樣,達到一定連接數(shù)時,內(nèi)存就滿了(如附件圖所示)
測試的時候,status里面顯示connections是不斷增加的,連接并沒有釋放掉
請問一下,asend_ 異步調(diào)用rpc服務(wù)后不會馬上就斷開連接的嗎? 如果不是,那連接是什么時候斷開的呢?