web-dev-qa-db-fra.com

Différence de mode Cluster et Fork en PM2

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?

71
Jinyoung Kim

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.

Qu'est-ce que cela signifie en interne?

Mode fourchette

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.

Mode cluster

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.

95
soyuka

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 :)

31
haotang

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.

14