线程和Socket.io

我期望在Node.js v.0.6.0和更高版本中使Socket.io与本地负载平衡(“集群”)进行多线程工作。

据我所知,Socket.io使用Redis来存储其内部数据。 我的理解是这样的:我们不想为每个工作人员产生一个新的Redis实例,而是要强制员工使用与Master相同的Redis实例。 因此,连接数据将在所有员工中共享。

主人这样的事情:

RedisInstance = new io.RedisStore;

我们必须以某种方式将RedisInstance传递给工人,并执行以下操作:

io.set('store', RedisInstance);

受此旧版第三方群集模块实施的启发,我有以下非工作实现:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

} else {
  // Do the work here
  io.sockets.on('connection', function (socket) {
    socket.on('chat', function (data) {
      socket.broadcast.emit('chat', data);
    })
  });
}

思考? 我可能会完全向错误的方向发展,任何人都可以指出一些想法?


其实你的代码应该是这样的:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

  // Do the work here
  io.sockets.on('connection', function (socket) {
    socket.on('chat', function (data) {
      socket.broadcast.emit('chat', data);
    })
  });
}

另一个选择是打开Socket.IO来监听多个端口,并且有类似HAProxy负载平衡的东西。 无论如何,您知道最重要的事情:使用RedisStore在一个流程之外进行扩展!

资源:

http://nodejs.org/docs/latest/api/cluster.html
我如何扩展socket.io?
如何在socket.io中重用redis连接?
节点:缩放socket.io / nowjs - 跨不同实例进行缩放
http://delicious.com/alessioaw/socket.io

链接地址: http://www.djcxy.com/p/63667.html

上一篇: threading and Socket.io

下一篇: Using socket.io with Cluster?