Node.js multi-threading et la Douille.io
Je suis à la recherche pour obtenir Socket.io de travail multi-thread avec natif d'équilibrage de la charge ("cluster") dans Node.js v. 0.6.0 et versions ultérieures.
De ce que je comprends, Socket.io utilise Redis pour stocker ses données internes. Ma compréhension est ceci: au lieu de pondre un nouveau Redis exemple pour tous les travailleurs, nous voulons forcer les travailleurs à utiliser les mêmes Redis instance en tant que maître. Ainsi, les données de connexion serait partagé entre tous les travailleurs.
Quelque chose comme ceci:
RedisInstance = new io.RedisStore;
L'on doit en quelque sorte de passer RedisInstance
pour les travailleurs et de faire ce qui suit:
io.set('store', RedisInstance);
Inspiré par cette mise en œuvre l'aide de l'ancien, 3ème partie du cluster de module, j'ai le non-travail de mise en œuvre:
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 suis peut-être complètement dans le mauvais sens, n'importe qui peut pointer vers des idées?
OriginalL'auteur David Chouinard | 2011-12-19
Vous devez vous connecter pour publier un commentaire.
Réellement votre code devrait ressembler à ceci:
Une autre option est d'ouvrir le Socket.IO à écouter sur plusieurs ports et avoir quelque chose comme HAProxy d'équilibrer la charge de trucs.
De toute façon vous connaissez la chose la plus importante: l'utilisation de RedisStore à l'échelle à l'extérieur d'un processus d'!
Ressources:
http://nodejs.org/docs/latest/api/cluster.html
Comment puis-je l'échelle de la prise.io?
Comment réutiliser le redis connexion de socket.io?
Nœud: Échelle de socket.io /nowjs - à l'échelle des différentes instances
http://delicious.com/alessioaw/socket.io
Avantages de HAProxy: vous auriez processus sur des ports différents, que vous pouvez suivre plus attentivement et redémarrer quand ils meurent (à l'aide de monit, arriviste). Aussi oui, vous avez besoin pour créer un nouveau RedisStore pour chaque travailleur. Pense que le groupe est une mise en œuvre au-dessus de child_process.fork(), donc en gros, vous copiez l'application autant de fois que nécessaire (le processus partagent le même descripteur de fichier autant que je sache).
J'ai juste essayé votre code d'échantillon, il semble ne pas être de travail. Lorsque le thread unique, 1500 connexions s'exécute jusqu'à 50% de CPU (chaque travailleur est en train de faire un peu plus de travail que dans l'échantillon). À l'aide de votre échantillon, je ne peux pas obtenir jusqu'à 500 connexions avant de tous processus s'exécute jusqu'à 80-90% de CPU. Donc, clairement, quelque chose est faux puisque c'est l'aggravation de la situation.
Il y a un exemple d'application avec child_process.fork() ici: github.com/dshaw/talks/tree/master/2011-10-jsclub/sample-app vous Pouvez également essayer et me dire comment ça se passe? Fondamentalement, mettre le travailleur code js dans app.js il y et essayez de suivre la même structure.
Ah, merci pour le lien. Idéalement, cela devrait fonctionner sur un seul port (pas plusieurs, que ce repo). Toutes les suggestions? Il semble que nous pourrions peut-être utiliser un socket io-annoncer à partager le Redis détails de la connexion à travers l'ensemble des travailleurs.
OriginalL'auteur alessioalex