最近接觸到websocket,需求很簡單,利用websocket讓用戶參與一個1v1的小游戲。環(huán)境是分布式部署,且每臺服務器是多進程,web服務器使用nodejs,websocket框架選用了socket.io。遇到的問題:首先,在單服務器調研,在利用nodejs多進程(cluster)時,建立websocket時會出現(xiàn)400報錯,后來發(fā)現(xiàn)了是多進程的問題,用戶訪問服務器時不能保證每次訪問到相同的進程中,所以后臺會報錯"Session ID unknown",可能是socket.io為了保證偶爾有可能會變成long polling,必須保證前后臺要傳遞一個session id,但是每次頁面刷新時,重新發(fā)起websocket應該和上次的刷新前的websocket沒關系了才對,也有可能是socket.io為了保證與服務器重連節(jié)省資源才引入了session id,不知道我的理解對不對。在網(wǎng)上查找了大量的資料,也看了socket.io官網(wǎng)的推薦方案(http://socket.io/docs/using-multiple-nodes/),有兩種:nginx利用配置ip_hash讓用戶每次都連接到固定的進程,沒玩過nginx不太懂。redis看了網(wǎng)上最多的既成的推薦方案也是redis,之前沒有接觸過redis,不知道其運行原理,大概了解之后,發(fā)現(xiàn)他是一個key-value的持久化存儲,與MemCache、mongoDB類似,官網(wǎng)給出的代碼示例:示例很簡單,把請求弄一個適配器轉向到連接redis服務,但是原理是什么樣的呢,共享內存的方案嗎,不太懂所以也沒下手。最后我選用了一個比較傻的方案,在不同的子進程中啟動websocket服務時選用了不同的端口,比如一臺服務器8核,會有8個端口3001-3008,這樣用戶連接某個固定端口時就不會再出現(xiàn)400error了,但是用戶命中到不同的端口后,相互之間如何通信仍然是個問題,這只是單臺服務器實驗,如果是集群,相互通信也是一個問題,而且關鍵是否需要每次用戶都連接到同一個端口和同一臺服務器呢?說到底,還是對websocket了解太少了,希望能在這里得到一點指導和幫助。
分布式websocket,如何讓命中不同服務器的人相互通信?
縹緲止盈
2018-09-06 15:30:24