Socket.io无法使用节点集群

时间:2016-09-14 08:28:52

标签: node.js websocket socket.io node-cluster

我有一个带有以下代码的cluster.js:

var numOfCpus = 16;
var cluster = require('cluster');
if (cluster.isMaster) {
    for (var i = 0; i < numOfCpus; i++) {
        cluster.fork();
    }
    console.log("master is running");
} else {
    console.log('Worker %d started', cluster.worker.id);

    var server = app.listen(8887);
    var io = require('socket.io').listen(server);

    var live_data = io.of('/live_data');
    live_data.on('connection',function(socket){
        console.log('Connected: %s', socket.id);
    });
}

当cluster.js中的numOfCpus = 1时,我的客户端应用程序正常工作。当我有超过1的任何东西时,socket.io开始给出以下错误:

enter image description here

我是否必须做一些特殊的事情来使socket.io与多个节点工作者一起工作?任何帮助将受到高度赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

正如robertklep在评论中指出的那样,使用粘性会话解决了这个问题。但是,我用于此目的的包是socketio-sticky-session

我的cluster.js的最终代码如下所示:

var sticky = require('socketio-sticky-session')
var cluster = require('cluster');
var os = require('os');
var options = {
    proxy: false,
    num: require('os').cpus().length
}

var server = sticky(options, function() {

    var server = app.listen();
    var io = require('socket.io').listen(server);

    var live_data = io.of('/live_data');
    live_data.on('connection',function(socket){
        console.log('Connected: %s', socket.id);
    });

    return server

}).listen(8887, function() {
console.log((cluster.worker ? 'WORKER ' + cluster.worker.id : 'MASTER') + ' | HOST ' + os.hostname() + ' | PORT ' + 8887)
})

有关粘性会话的工作和实施的详细信息,请参阅@ https://github.com/elad/node-cluster-socket.io