Différence de mode de cluster et de fourche dans PM2

89

J'ai beaucoup cherché pour comprendre cette question, mais je n'ai pas obtenu d'explication claire. Existe-t-il une seule différence entre une application en cluster qui peut être mise à l'échelle et une application fourchue?

Le site public de PM2 explique que le mode Cluster peut faire ces fonctionnalités, mais personne ne parle des avantages du mode Fork (peut-être qu'il peut devenir NODE_APP_INSTANCEvariable).

J'ai l'impression que Cluster pourrait faire partie de Fork parce que Fork semble être utilisé en général. Donc, je suppose que Fork signifie simplement «processus fourchu» du point de PM2 et Cluster signifie «processus fourchu qui peut être mis à l'échelle». Alors, pourquoi devrais-je utiliser le mode Fork?

Jinyoung Kim
la source

Réponses:

121

La principale différence entre fork_modeet cluster_modeest qu'il ordonne à pm2 d'utiliser soit l' api child_process.fork, soit l' API du cluster .

Qu'est-ce que cela signifie en interne?

Mode fourche

Prenez le forkmode comme un processus de base qui se reproduit. Cela permet de changer le exec_interpreter, afin que vous puissiez exécuter phpun pythonserveur ou un serveur avec pm2. Oui, exec_interpreterc'est la "commande" utilisée pour démarrer le processus enfant. Par défaut, pm2 utilisera nodece qui pm2 start server.jsfera quelque chose comme:

require('child_process').spawn('node', ['server.js'])

Ce mode est très utile car il permet de nombreuses possibilités. Par exemple, vous pouvez lancer plusieurs serveurs sur des ports préétablis qui seront ensuite équilibrés par HAProxy ou Nginx.

Mode cluster

Le clusterne fonctionne qu'avec nodecomme il est exec_interpreterparce qu'il accédera au module groupe nodejs (par exemple: isMaster, forkméthodes , etc.). C'est idéal pour la gestion des processus sans configuration, car le processus sera automatiquement forké dans plusieurs instances. Par exemple pm2 start -i 4 server.js, lancera 4 instances de server.jset laissera le module de cluster gérer l'équilibrage de charge.

soyuka
la source
3
question basée sur votre réponse ici: j'ai un cas d'utilisation dont j'ai besoin, disons 30 instances de mon application node.js générées avec un numéro de port unique et prédéfini (: 3000 à: 3030) et que chacune des instances gère un groupe spécifique d'utilisateurs qui accéderont uniquement sur leur port attribué. Je ne veux donc pas que le processus maître fasse l'équilibrage de charge, mais plutôt qu'il ne démarre (et continue à fonctionner) que les processus enfants. Est-ce possible? Ou tentera-t-il de répartir la charge sur tous les processus enfants générés uniquement?
tamak
3
J'utiliserais l'API programmatique pm2 pour lancer 30 processus dans fork_mode et utiliserais autre chose comme équilibreur de charge entre les 30 ports. Vous pouvez également utiliser pm2 start -i 30 app.jset laisser le cluster nodejs faire le travail.
soyuka
11
Remarque: dans cluster modele processus maître est un point de défaillance unique.
Karl Pokus
40

Node.js est monothread.

Cela signifie qu'un seul cœur de votre processeur Intel quad-core peut exécuter l'application de nœud.

Il a appelé: fork_mode.

Nous l'utilisons pour le développement local .

pm2 start server.js -i 0 vous aide à exécuter 1 thread de nœud sur chaque cœur de votre CPU.

Et équilibrez automatiquement la charge des demandes à venir sans état.

Sur le même port .

Nous l' appelons: cluster_mode.

Qui est utilisé dans un souci de performance en production .

Vous pouvez également choisir de le faire sur le développement local si vous souhaitez tester votre PC :)

haotang
la source
2
thaks, cela efface beaucoup de choses dans mon esprit à propos de nodejs
Rishabh Agrawal
1
bonne explication !!
Piqué
1
Node.js n'est pas un thread unique, il y a (actuellement) un thread userland mais il est certainement soutenu par un threadpool libuv.
Benjamin Gruenbaum
1
@BenjaminGruenbaum D'accord avec vous. Ma déclaration doit être comprise dans l'hypothèse que je ne mentionne pas trop profondément au niveau
libuv
16

La documentation et les sources sont vraiment trompeuses ici.

En lisant à ce sujet dans les sources, les seules différences semblent être qu'elles utilisent soit le nœud, clustersoit l' child_processAPI. Depuis clusterutilise ce dernier, vous faites en fait de même. Il y a juste beaucoup plus de coutume qui stdiopasse autour de l'auberge fork_mode. clusterNe peut également être communiqué que via des chaînes, pas des objets.

Par défaut, vous utilisez fork_mode. Si vous passez l' -i [number]option-, vous entrez dans cluster_mode, que vous visez généralement w / pm2.

De plus, l' fork_modeinstance ne peut probablement pas écouter sur le même port à cause de EADDRINUSE. cluster_modepouvez. De cette façon, vous pouvez également structurer votre application pour qu'elle s'exécute sur le même port en équilibrant automatiquement la charge. Vous devez alors créer des applications sans état, par exemple des sessions, des dbs.

eljefedelrodeodeljefe
la source
1
Je suis encore confus. clustermodule intégré utilise en child_processinterne? et votre suggestion est que si j'ai besoin de flexibilité stdio, je dois utiliser le mode Fork?
Jinyoung Kim le
La stdiochose est quelque chose de pm2la mise en œuvre de. Ne t'inquiète pas pour ça. Vous souhaitez l'utiliser cluster_modeen production, car cela renforce votre instance car elle exécute des -i [number]instances en arrière-plan. À utiliser fork_modesi le durcissement n'est pas nécessaire ou si vous voulez de meilleurs journaux et autres.
eljefedelrodeodeljefe
1
cluster_modeUtilise également évidemment plus de ressources de votre système car vous exécutez des -i [number]processus.
eljefedelrodeodeljefe
Bien que j'apprécie chaleureusement votre réponse, je n'ai même pas compris maintenant. La plupart de vos explications sont des choses naturelles (par exemple, l'utilisation de CLI cluster_mode, l'équilibrage de la charge cluster_mode, cluster_modeutilise plus de ressources ..). C'est la raison pour laquelle je n'ai pas voté. Pourriez-vous expliquer les deux cas d'utilisation simples? Chaque cas doit être raisonnable pourquoi il a pris son mode.
Jinyoung Kim
@eljefedelrodeodeljefe Pouvez-vous expliquer plus à propos de "Vous devez créer des applications sans état alors par exemple des sessions, des dbs."? Pourquoi l'application devrait-elle être sans état?
STEN