Socket.io 无法使用节点集群
Socket.io not working with 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 开始出现以下错误:
我是否必须做任何特殊的事情才能使 socket.io 与多个节点工作人员一起工作?任何帮助将不胜感激。谢谢
正如 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
我有一个 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 开始出现以下错误:
我是否必须做任何特殊的事情才能使 socket.io 与多个节点工作人员一起工作?任何帮助将不胜感激。谢谢
正如 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