[英]Node.js,Socket.io,Http-Proxy,Cluster,Express - Handshake drops on disconnect - delay in reconnect
我正在使用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);
});
});
}
您需要添加一個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))
作為rbrc,你需要一些方法讓你的worker中的不同socket.io服務器進行通信和共享數據,否則當你連接到一個然后連接另一個時,他們就不知道你已經有了一個會話。 這也適用於快速會話,我看到你RedisStore
那里使用RedisStore
。 由於你已經依賴redis, socketio.RedisStore
似乎很合適,否則你可以試試socket.io-clusterhub 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.