題目描述的問題,困擾了(?д?; )我很久。本地開發(fā)調(diào)試都好好的,怎么部署到測(cè)試環(huán)境之后,本該發(fā)出去的消息,在Js客戶端死活收不到消息。各種懷疑排查,多次部署還是沒能改善。怎么辦?繼續(xù)排查。
這次我把與消息發(fā)送最直接關(guān)鍵的兩個(gè)對(duì)象Debug打印出來,這兩個(gè)對(duì)象就是服務(wù)端的SocketIONamespace和客戶端建立連接后保存Session的SocketIOClient。然后,發(fā)現(xiàn)了奇特的現(xiàn)象。多實(shí)例部署時(shí),少數(shù)的幾個(gè)客戶端都連接到了一個(gè)實(shí)例,而消息是從另外一個(gè)沒有任何客戶端連接的實(shí)例發(fā)出的。有了發(fā)現(xiàn),開始猜測(cè)netty socket IO server開發(fā)者沒能想到多實(shí)例少數(shù)交叉客戶端的情況,在檢測(cè)到實(shí)例沒有客戶端連接時(shí),是不能有服務(wù)端主動(dòng)發(fā)送消息的。它此時(shí)認(rèn)為沒有客戶端,你服務(wù)端的消息沒有接受者,干脆不發(fā)送了。沒有客戶端也不會(huì)知道。
而在集群多實(shí)例部署時(shí),當(dāng)前實(shí)例沒有客戶端,從當(dāng)前實(shí)例發(fā)送的消息,可以被其他實(shí)例的客戶端接收呀,自作主張不發(fā)送了,是什么意思?也許是沒理解作者的設(shè)計(jì)意圖,又或者是集群部署時(shí),沒有相互發(fā)現(xiàn)各自的存在??傊梢宰鳛橐粋€(gè)問題,在集群多實(shí)例部署時(shí)要考慮到。