Node.js, многопоточность и Socket.io

Я хочу заставить Socket.io работать в многопоточном режиме с собственной балансировкой нагрузки («кластер») в Node.js v.0.6.0 и новее.

Насколько я понимаю, Socket.io использует Redis для хранения своих внутренних данных. Я понимаю следующее: вместо того, чтобы создавать новый экземпляр Redis для каждого рабочего, мы хотим заставить рабочих использовать тот же экземпляр 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);
    })
  });
}

Мысли? Я могу пойти совершенно в неправильном направлении, кто-нибудь может указать на некоторые идеи?

10
задан David Chouinard 19 December 2011 в 15:18
поделиться