Node.js, multi-threading et Socket.io

Je cherche à obtenir Socket.io pour travailler multi-thread avec équilibrage de charge natif ("cluster") dans Node.js v.0.6.0 et versions ultérieures.

D'après ce que je comprends, Socket.io utilise Redis pour stocker ses données internes. Ma compréhension est la suivante: au lieu de générer une nouvelle instance de Redis pour chaque travailleur, nous voulons obliger les travailleurs à utiliser la même instance de Redis que le maître. Ainsi, les données de connexion seraient partagées entre tous les travailleurs.

Quelque chose comme ça dans le maître:

RedisInstance = new io.RedisStore; 

Nous devons en quelque sorte passer RedisInstance aux travailleurs et faire ce qui suit:

 io.set('store', RedisInstance); 

Inspiré par cette implémentation en utilisant l'ancien module de cluster tiers, j'ai l'implémentation non fonctionnelle suivante:

 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); }) }); } 

Pensées? Je pourrais aller complètement dans la mauvaise direction, n'importe qui peut pointer vers quelques idées?

En fait, votre code devrait ressembler à ceci:

 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); }) }); } 

Une autre option est d'ouvrir Socket.IO pour écouter plusieurs ports et avoir quelque chose comme HAProxy load-balance stuff. Quoi qu'il en soit, vous connaissez la chose la plus importante: utiliser RedisStore pour s'échelonner en dehors d'un processus!

Ressources:

http://nodejs.org/docs/latest/api/cluster.html
Comment puis-je étaler socket.io?
Comment réutiliser la connexion redis dans socket.io?
Nœud: Scale socket.io / nowjs – échelle à travers différentes instances
http://delicious.com/alessioaw/socket.io