我正在使用node.js和socket.io。我正在使用http-proxy在运行apache的机器上使用端口80。 Apache处于不同的IP上。这一切都很有效。
我添加了Cluster,事情变得很时髦。它按预期产生了两个工作者(双核VM)。但客户端的连接已关闭。有时它很好,如果你断开连接,就会有一个延迟重新连接(没有群集)。
这是我的代码..任何想法为什么断开连接和使用群集连接之间的延迟?
var http = require('http'),
httpProxy = require('http-proxy'),
io = require('socket.io'),
cluster = require('cluster'),
express = require('express'),
RedisStore = require('connect-redis')(express);
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
//Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died');
});
} else {
//Server for workers
var app = express.createServer().listen(8585, '172.16.183.129');
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ secret: "secret", store: new RedisStore}));
app.use(app.router);
app.use(express.errorHandler({showStack: false, dumpExceptions: false}));
app.use(express.static(__dirname + '/public'));
});
//Create proxy server to use port 80
var proxy = httpProxy.createServer(8585, '172.16.183.129');
proxy.listen(80, '172.16.183.129');
//Initilize socket.io
var io = require('socket.io').listen(app, {origins: '*:*'});
io.sockets.on('connection', function(socket){
var test = setInterval(function() {
socket.emit('test', { result: numCPUs});
i++;
}, 900);
socket.on('disconnect', function () {
console.log('disconnect');
clearInterval(auctionTimer);
});
});
}
答案 0 :(得分:2)
您需要添加一个RedisStore,以便套接字工作者可以一起工作。请注意,最新版本的socket.io有一个内置的RedisStore,您可能应该使用它来代替connect-redis。
socketio = require('socket.io')
var io = socketio.listen(app, {origins: '*:*'});
var host = 'redisserver'
var opts = {redisSub:{host:host},redisPub:{host:host},redisClient:{host:host}}
io.set('store', new socketio.RedisStore(opts))
答案 1 :(得分:0)
作为rbrc,你需要一些方法让你的worker中的不同socket.io服务器进行通信和共享数据,否则当你连接到一个然后连接另一个时,他们就不知道你已经有了一个会话。这适用于快递&#39;会议也是,我看到你在那里使用RedisStore
。由于您已经依赖redis,socketio.RedisStore
似乎很合适,否则您可以尝试socket.io-clusterhub。