Hi,walkor,
目前該問題已是在生產(chǎn)項(xiàng)目上,我在PHP腳本里面直接引用RPCclient.php,然后遠(yuǎn)程調(diào)用RPC服務(wù)器往數(shù)據(jù)庫里寫數(shù)據(jù),腳本執(zhí)行完一段時(shí)間后發(fā)現(xiàn)腳本的進(jìn)程退出了,看了一下日志是RPC拋異常了:Uncaught exception 'Exception' with message 'recvData empty',導(dǎo)致腳本進(jìn)程退出
我有幾點(diǎn)想請問一下:
1,Uncaught exception 'Exception' with message 'recvData empty'是什么原因?qū)е碌模?,我看了下代碼是沒有問題的(因?yàn)檎E苓^一段時(shí)間),看了下RPC服務(wù)器中workerman.log中也沒異常日志,
2,遠(yuǎn)程請求RPC時(shí),Uncaught exception 'Exception' with message 'recvData empty' 這種異常是不能避免的嗎?
3.如果我有asend_ 異常方法調(diào)用的話,會(huì)出現(xiàn)這種異常嗎?如果出現(xiàn)了,但對腳本進(jìn)程有影響嗎?
謝謝walkor解答!
recvData empty 意思是客戶端發(fā)給服務(wù)端的請求超過5秒還沒有返回結(jié)果,也就是說rpc服務(wù)端處理超時(shí)了。
應(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í)時(shí)間是這里設(shè)置的,超時(shí)時(shí)間默認(rèn)是5秒。
asend_ 異常方法調(diào)用的話,如果服務(wù)端超時(shí),也會(huì)出現(xiàn)這種異常。
好的 謝謝walkor, 我這邊的業(yè)務(wù)是輪詢新聞消息池,消息池里面有消息的話,就不斷的遠(yuǎn)程調(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的時(shí)候是不是發(fā)送數(shù)據(jù)不宜過大?
是的 內(nèi)存滿了,walkor ,我找到原因在哪里了,是因?yàn)槟_本不斷通過異常方式asend_ 遠(yuǎn)程調(diào)用RPC服務(wù)導(dǎo)致連接數(shù)(connections)不斷增加導(dǎo)致的,我在測試機(jī)上測試了一下,把RPC服務(wù)里面被調(diào)用的方法的業(yè)務(wù)全部注釋掉了,只留一個(gè)空方法,結(jié)果還是一樣,達(dá)到一定連接數(shù)時(shí),內(nèi)存就滿了(如附件圖所示)
測試的時(shí)候,status里面顯示connections是不斷增加的,連接并沒有釋放掉
請問一下,asend_ 異步調(diào)用rpc服務(wù)后不會(huì)馬上就斷開連接的嗎? 如果不是,那連接是什么時(shí)候斷開的呢?