【发布时间】:2015-02-13 21:15:40
【问题描述】:
即使是一个简单的示例,我也无法让sticky-sessions socket.io 模块正常工作。按照自述文件 (https://github.com/indutny/sticky-session) 中给出的最小示例,我只是想让这个示例正常工作:
var cluster = require('cluster');
var sticky = require('sticky-session');
var http = require('http');
if (cluster.isMaster) {
for (var i = 0; i < 4; i++) {
cluster.fork();
}
Object.keys(cluster.workers).forEach(function(id) {
console.log("Worker running with ID : " +
cluster.workers[id].process.pid);
});
}
if (cluster.isWorker) {
var anotherServer = http.createServer(function(req, res) {
res.end('hello world!');
});
anotherServer.listen(3000);
console.log('http server on 3000');
}
sticky(function() {
var io = require('socket.io')();
var server = http.createServer(function(req, res) {
res.end('socket.io');
});
io.listen(server);
io.on('connection', function onConnect(socket) {
console.log('someone connected.');
socket.on('sync', sync);
socket.on('send', send);
function sync(id) {
socket.join(id);
console.log('someone joined ' + id);
}
function send(id, msg) {
io.sockets.in(id).emit(msg);
console.log('someone sent ' + msg + ' to ' + id);
}
});
return server;
}).listen(3001, function() {
console.log('socket.io server on 3001')
});
还有一个简单的客户:
var socket = require('socket.io-client')('http://localhost:3001');
socket.on('connect', function() {
console.log('connected')
socket.emit('sync', 'secret')
});
工人启动良好。 http 服务器工作正常。但是当客户端连接时,控制台会记录“有人连接”,仅此而已。客户端从不触发 on connect 事件,所以我认为升级/握手失败或其他什么。如果有人能发现我做错了什么,那将有很大帮助。
谢谢!
【问题讨论】:
-
曾经解决过这个问题吗?我只是遇到客户端不断重新连接的问题
-
基本上不维护粘性会话。我不想使用redis,因为我希望一切都简单,但最后我不得不这样做。 redis 适配器非常易于使用,您无需进行任何配置。只需安装 redis 并将所有内容连接起来。为了让它在集群上工作,我必须做最后一件事:我必须在客户端和服务器上指定传输:web 套接字。 WS 必须是第一个(ws,然后是轮询)或唯一的选择。完成这两件事后,一切都完美无缺。如果需要,我可以用示例更新我的答案。
-
感谢您的回复,是的,这将非常有帮助:)
标签: node.js session websocket socket.io cluster-computing