J'ai beaucoup cherché à comprendre cette question, mais je n'ai pas eu d'explication claire. Existe-t-il une seule différence entre une application en cluster et une application en fourchette?
Le site public de PM2 explique que le mode Cluster peut faire ces fonctionnalités sont mais personne ne dit à propos des avantages du mode Fork (peut-être qu'il peut obtenir NODE_APP_INSTANCE
variable).
Je pense 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 brouillé" du point de vue de PM2 et que Cluster signifie "processus brisé pouvant être mis à l'échelle". Alors, pourquoi devrais-je utiliser le mode Fork?
La principale différence entre fork_mode
et cluster_mode
est qu’il ordonne à pm2 d’utiliser soit l’API child_process.fork , soit le cluster api.
Prenez le mode fork
comme processus de base. Cela permet de changer le exec_interpreter
, afin que vous puissiez exécuter un serveur php
ou python
avec pm2. Oui le exec_interpreter
est la "commande" utilisée pour démarrer le processus enfant. Par défaut, pm2 utilisera node
pour que pm2 start server.js
fera quelque chose comme:
require('child_process').spawn('node', ['server.js'])
Ce mode est très utile car il permet beaucoup de possibilités. Par exemple, vous pouvez lancer plusieurs serveurs sur des ports pré-établis qui seront ensuite équilibrés par HAProxy ou Nginx.
Le cluster
ne fonctionnera qu'avec node
car c'est exec_interpreter
parce qu’il aura accès au module de cluster nodejs (par exemple: isMaster
, fork
méthodes, etc.). Ceci est idéal pour la gestion de processus sans configuration car le processus sera automatiquement créé dans plusieurs instances. Par exemple pm2 start -i 4 server.js
lancera 4 instances de server.js
et laissez le module de cluster gérer l’équilibrage de charge.
Node.js est un seul thread.
Cela signifie qu'un seul cœur de votre processeur Intel quadricœur peut exécuter l'application de noeud.
Il a appelé: fork_mode
.
Nous l'utilisons pour local dev.
pm2 start server.js -i 0
vous aide à exécuter 1 thread de nœud sur chaque noyau de votre CPU.
Et auto-load-balance les requêtes à venir sans état.
Sur le même port.
Nous l'appelons: cluster_mode
.
Qui est utilisé dans le but de performance en production.
Vous pouvez également choisir de le faire sur un développeur local si vous souhaitez tester votre PC sous stress :)
La documentation et les sources sont vraiment trompeuses ici.
En lisant ceci dans les sources, la seule différence semble être qu’elles utilisent soit le noeud cluster
ou child_process
API. Puisque cluster
utilise ce dernier moyen, vous faites la même chose. Il y a juste beaucoup plus de personnalisation stdio
à faire circuler passe inn fork_mode
. De plus, cluster
ne peut être communiqué qu'avec des chaînes, pas des objets.
Par défaut, vous utilisez fork_mode
. Si vous passez le -i [number]
- option, vous allez dans cluster_mode
, que vous visez généralement w/pm2
.
Aussi fork_mode
_ instance ne peut probablement pas écouter sur le même port en raison de EADDRINUSE
. cluster_mode
pouvez. 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. sessions, dbs.