Comment fonctionne le module de cluster dans Node.js?

Quelqu'un peut-il expliquer en détail comment le module core cluster fonctionne dans le nœud.js?

Comment les travailleurs sont capables d'écouter un seul port?

Pour autant que je sache que le processus maître fait l'écoute, mais comment il peut savoir quels ports écouter puisque les travailleurs sont démarrés après le processus maître? Est-ce qu'ils communiquent d'une manière ou d'une autre cela au maître en utilisant le canal de communication child_process.fork? Et si oui comment la connexion entrante au port est passée du maître à le travailleur?

Aussi, je me demande quelle logique est utilisée pour déterminer à quel travailleur une connexion entrante est passée?

29
demandé sur Whymarrh 2012-03-23 01:21:21

4 réponses

Je sais que c'est une vieille question, mais c'est maintenant expliqué à nodejs.org ici:

Les processus de travail sont générés à l'aide du processus child_process.fourche méthode, afin qu'ils puissent communiquer avec le parent via IPC et pass server poignées avant et en arrière.

Lorsque vous appelez le serveur.écouter(...) dans un worker, il sérialise le arguments et transmet la requête au processus maître. Si le maître le processus a déjà un serveur d'écoute correspondant du travailleur exigences, puis il passe la poignée au travailleur. Si ce n'est pas ont déjà un serveur d'écoute correspondant à cette exigence, alors il va créer un, et passer la poignée au travailleur.

Cela provoque un comportement potentiellement surprenant dans trois cas de bord:

Serveur.écoutez ({fd: 7}) - Parce que le message est passé au maître, descripteur de fichier 7 dans le parent sera écouté, et la poignée transmis au travailleur, plutôt que d'écouter l'idée du travailleur de ce que le descripteur de fichier Numéro 7 fait référence.

Serveur.écouter (gérer) - L'écoute sur les poignées explicitement provoquera le travailleur à utiliser la poignée fournie, plutôt que de parler au maître processus. Si le travailleur a déjà la poignée, alors il est présumé que vous savez ce que vous faites.

Serveur.écouter(0) - Normalement, cela entraînera les serveurs à écouter sur un port aléatoire. Cependant, dans un cluster, chaque travailleur recevra le même port" aléatoire " à chaque fois ils écoutent(0). En substance, le port est hasard la première fois, mais prévisible par la suite. Si vous voulez écouter sur un port unique, Générer un numéro de port basé sur le cluster travailleur ID.

Lorsque plusieurs processus sont tous accept () ing sur le même sous-jacent ressource, la charge du système d'exploitation équilibre à travers eux très efficacement. Il n'y a pas de logique de routage dans le nœud.js, ou dans votre programme, et aucun état partagé entre les travailleurs. Par conséquent, il est important de conception votre programme de telle sorte qu'il ne repose pas trop sur objets de données en mémoire pour des choses comme les sessions et la connexion.

Parce que les travailleurs sont tous des processus distincts, ils peuvent être re-engendré en fonction des besoins de votre programme, sans affecter les autres travailleur. Tant qu'il y a des travailleurs encore en vie, le serveur continuera à accepter les connexions. Le nœud ne fonctionne pas automatiquement gérer le nombre de travailleurs pour vous, cependant. Il est de votre responsabilité de gérer le pool de travailleurs pour les besoins de votre application.

12
répondu OpenUserX03 2015-02-01 02:37:04

NodeJS utilise une décision round-robin pour effectuer l'équilibrage de charge entre les processus enfants. Il donnera les connexions entrantes à un processus vide, basé sur L'algorithme RR.

Les enfants et le parent ne partagent rien, tout le script est exécuté du début à la fin, c'est la principale différence entre le fork c normal. L'enfant fourchu c traditionnel continuerait à s'exécuter à partir de l'instruction où il était laissé, pas le début comme NodeJS. Si Si vous voulez partager quelque chose, vous devez vous connecter à un cache comme MemCache ou Redis.

Donc le code ci-dessous produit 6 6 6 (Pas de Mal signifie) sur la console.

var cluster = require("cluster");
var a = 5;
a++;
console.log(a);
if ( cluster.isMaster){
    worker = cluster.fork();
    worker = cluster.fork();
}
8
répondu Mustafa 2012-03-22 21:43:19

Voici un article de blog qui explique cela

4
répondu az7ar 2013-08-04 03:40:21

En tant que mise à jour de la réponse de @OpenUserX03, nodejs n'utilise plus les équilibres de charge du système mais en utilise un intégré. à partir de ce post:

Pour réparer ce nœud v0. 12 a obtenu une nouvelle implémentation en utilisant un algorithme Round-robin pour répartir la charge entre les travailleurs d'une meilleure manière. C'est L'approche par défaut que le nœud utilise depuis lors, y compris le nœud V6. 0. 0

0
répondu Li Jinyao 2018-01-26 17:45:14