2015-09-04 60 views
0

我使用的是Node.js的同一服務器expresssocket.io圖書館工作,聽的同一端口上。我想使用cluster模塊來支持循環負載平衡,但我希望expresssocket.io的負載平衡行爲不同。的行爲如下:粘socket.io會議通過cookie中的node.js集羣,而不黏快遞會議

  1. 爲HTTP傳入連接/ S應該連接到任何單個工人
  2. 爲WS/S傳入連接應連接到特定的工人的基礎上,cookie值 ---更廣泛地說,根據一個值

是否有任何可用的庫來實現我想要的行爲?如果不是,我應該如何去完成這些行爲?

回答

1

有很多方法可以做到這一點。我會把你鏈接到this guide on using redis as a pub sub,但我會給你一個超級簡短的介紹它的樣子。

所以產卵兩個集羣在啓動時,或然而,許多你想..

var aWorker = cluster.fork(); 
var bWorker = cluster.fork(); 

,那麼你需要將其設置爲監聽它們各自的端口,所以使用net模塊:

var server1 = require('net').createServer([options], function(connection) { 
    aWorker.send('ConnectionEvent' , connection); 
}).listen(80); //HTTP/WS 
var server2 = require('net').createServer([options], function(connection) { 
    bWorker.send('ConnectionEvent' , connection); 
}).listen(443); //HTTPS/WSS 

集羣中的過程:

var app_server = require('express')().listen(0, 'localhost'); 
var io = require('socket.io')(app_server); 
io.adapter(require('socket.io-redis')({ host: '127.0.0.1', port: **REDIS PORT** }); 
io.on('connection', function (socket) { 
    //Rest of your io server code 
... 

process.on('message' , function(message, connection) { 
    if(connection && message === 'ConnectionEvent') { 
     app_server.emit('connection', connection); 
     connection.resume(); 
    } 
} 

相信Socket.io的房間功能交流會在第二點上完成你想要做的事情,而不是依靠創建新的工作任務。這只是我的看法。