我如何处理集群的Socket.IO房间?

我有一个服务器与集群工作,并使用socke.IO工作我使用粘滞会话,但我有我的房间有问题(我不知道我做的方式是最好的select):集群正在实例化进程,每个进程都有特定数量的房间。

  • 服务器
    • 过程1
      • 会议室1
      • 室2
      • 房间N
    • 过程2
      • 会议室1
      • 室2
      • 房间N

我做的连接一些用户到房间(只有一个进程)的方式是使用路由,在这里用户访问一个页面,当他试图与Socket.io连接时,我检查URL和插入的信息他在一个房间里。

我的问题是使用集群来实现这个服务器我不能在特定的房间中插入用户,因为有一些房间只存在于特定的进程中,粘滞的会话把他放在另一个进程中。 我怎样才能把用户放在另一个进程的房间? 此外,使用只能看到他在服务器上的过程的路线,我想显示页面中的每个房间。

我已经阅读了Redis-Adapter,但是在使用Socket.io + Cluster(Sticky-session + redis-adapter)+房间的github上找不到解决scheme。

按照我的代码分享我所做的:

//Cluster.Master with simplified Code if (cluster.isMaster) { var workers = []; // Spawn workers. for (var i = 0; i < num_processes; i++) { spawn(i); } // Create the outside facing server listening on our port. var server = net.createServer({ pauseOnConnect: true }, function(connection) { // We received a connection and need to pass it to the appropriate // worker. Get the worker for this connection's source IP and pass // it the connection. var worker = workers[worker_index(connection.remoteAddress, num_processes)]; worker.send('sticky-session:connection', connection); }).listen(process.env.PORT); } else { console.log('I am worker #' + cluster.worker.id); var app = new express(); //view engine app.set('views', './views'); app.set('view engine', 'pug'); //statics app.use(express.static(path.join(__dirname, 'public'))); //rooms app.use('/', rooms); var server = app.listen(0, 'localhost'), io = sio(server); io.adapter(sio_redis({ host: 'localhost', port: 6379 })); //This File has the socket events (socket.on('messageX', function(){})) // And there I am var realtime = require('./realtime/socketIOEvents.js')(io); // Listen to messages sent from the master. Ignore everything else. process.on('message', function(message, connection) { if (message !== 'sticky-session:connection') { return; } // Emulate a connection event on the server by emitting the // event with the connection the master sent us. server.emit('connection', connection); connection.resume(); }); } 

socketio-redis是一件正确的事情。 每个sserver /进程在redis队列中监听一个主题。 简而言之,socketio-redis只是将该事件发布到群集中的每个其他服务器/进程。 所以就房间而言,他们只是对一群有兴趣收听房间中的消息的套接字的抽象。

即使套接字分配给不同的服务器/进程,它们也可以是同一个房间的一部分。 随着每条消息的进入,每个服务器都知道它并将其传递给所需的套接字。

就正确性而言,你的架构是正确的也是正确的,因为你的代理也决定有select地转发消息,但是它在消息的生命周期中增加跳数。 你真的不需要这个代理来处理套接字路由。

这里是基于房间join的示例代码。

http://www.html5gamedevs.com/topic/12321-create-a-cluster-server-with-nodejs-and-socketio/

让我知道,如果你有这个职位的问题。

经过很多次尝试之后,我在工作人员的顶部使用代理服务器,并在其他服务器(Redis)中注册了房间。 当我用一个房间的URL连接到服务器时,我的代理服务器检测到我正在尝试连接的工作人员,并将我的Web套接字连接路由到正确的工作人员。

  Proxy / | \ worker(5rooms) worker(5rooms) worker(5rooms) \ | / Redis 

这解决了我的问题,但它不使用socket.io-redis 。 我们如何用socket.io-redis解决这个问题? 在redis中添加每个用户,套接字和variables,以便在工作中进行处理是一种有效的方法?