2017-10-20 93 views
0

我在單臺機器上使用websockets/ws。它的工作正常。我想在多核和多個實例上水平擴展它。 對於多核心我試過pm2,它似乎工作很好。擴展具有多個服務器實例的websockets/ws

第一個問:這是最好的方法還是合適的方法?下面是我的測試代碼PM2

// ws-server.js 
const WebSocket = require('ws'); 

const wss = new WebSocket.Server({ port: 3131 }); 

var pid = process.pid + '' 
console.log('process pid: '+ pid) 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
    if (message === 'get-pid') { 
     ws.send('pid-' + pid) 
    } else { 
     var matched = pid === message ? 'old friends' : 'strangers' 
     ws.send([pid, message, 'we are ' + matched].join(', ')) 
    } 
    }); 
    ws.send('first time') 
}); 

和客戶端的WebSocket實例

// ws-cient.js 
const WebSocket = require('ws'); 
const ws = new WebSocket('ws://localhost:3131/'); 

var pid 
ws.on('open', function open() { 
    ws.send('get-pid'); 
    setInterval(function() { 
    ws.send(pid) 
    }, 1000) 
}); 

ws.on('message', function incoming(data) { 
    if (/^pid/.test(data)) { 
    pid = data.match(/\d+/)[0] 
    console.log('got pid: ' + pid) 
    } else { 
    console.log(data) 
    } 
}); 

只要運行在服務器和客戶端PM2

$ pm2 start ws-server.js -i 50 
    $ pm2 start ws-client.js -i 50 

如果你現在看到的日誌pm2 logs ws-client各客戶端每秒都會訪問相同的連接(在服務器上)。 因此對於多核心ws可以很好地與PM2配合使用。

第二個問題:如何用多個實例進行縮放? 我剛剛看到SocketCluster水平縮放,但它可以與websockets/ws一起使用,因爲我已經開發了ws代碼。什麼可能是水平縮放的其他解決方案。

回答

1

不幸的是,這將是很難在不同的工藝規模的WebSocket,我會建議你使用這個庫:

https://github.com/ClusterWS/ClusterWS

這個庫的主要目的是跨進程和機器規模的WebSocket 。 另外,好處是圖書館小而快。

+0

Dmitrii謝謝,我會通過這個庫 – Gagan