Я хочу заставить 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);
})
});
}
Мысли? Я могу пойти совершенно в неправильном направлении, кто-нибудь может указать на некоторые идеи?