socket.io與cluster
在線上系統(tǒng)中,需要使用node的多進程模型,我們可以自己實現簡易的基于cluster模式的socket分發(fā)模型,也可以使用比較穩(wěn)定的pm2這樣進程管理工具。在常規(guī)的http服務中,這套模式一切正常,可是一旦server中集成了socket.io服務就會導致ws通道建立失敗,即使通過backup的polling方式仍會出現時斷時連的現象,因此我們需要解決這種問題,讓socket.io充分利用多核。
在這里之所以提到socket.io而未說websocket服務,是因為socket.io在封裝websocket基礎上又保證了可用性。在客戶端未提供websocket功能的基礎上使用xhr polling、jsonp或forever iframe的方式進行兼容,同時在建立ws連接前往往通過幾次http輪訓確保ws服務可用,因此socket.io并不等于websocket。再往底層深入研究,socket.io其實并沒有做真正的websocket兼容,而是提供了上層的接口以及namespace服務,真正的邏輯則是在“engine.io”模塊。該模塊實現握手的http代理、連接升級、心跳、傳輸方式等,因此研究engine.io模塊才能清楚的了解socket.io實現機制。
場景重現
服務端采用express+socket.io的組合方案,搭配pm2的cluster模式,實現一個簡易的b/s通信demo:
app.js
var path = require('path');var app = require('express')(), server = require('http').createServer(app), io = require('socket.io')(server); io .on('connection', function(socket) { socket.on('disconnect', function() { console.log('/: disconnect-------->')