Cluster- und Fork-Modusunterschied in PM2

88

Ich habe viel gesucht, um diese Frage herauszufinden, aber ich habe keine klare Erklärung bekommen. Gibt es nur einen Unterschied, dass eine Cluster-App skaliert werden kann und eine gegabelte App nicht?

Auf der öffentlichen Website von PM2 wird erklärt, dass der Cluster-Modus diese Funktion ausführen kann, aber niemand sagt über die Vorteile des Fork-Modus (möglicherweise kann er NODE_APP_INSTANCEvariabel werden).

Ich denke, Cluster könnte Teil von Fork sein, weil Fork allgemein verwendet zu werden scheint. Ich denke also, Fork bedeutet ab PM2 nur "gegabelter Prozess" und Cluster bedeutet "gegabelter Prozess, der skaliert werden kann". Warum sollte ich dann den Gabelmodus verwenden?

Jinyoung Kim
quelle

Antworten:

118

Der Hauptunterschied zwischen fork_modeund cluster_modebesteht darin, dass pm2 angewiesen wird, entweder die API child_process.fork oder die Cluster- API zu verwenden.

Was bedeutet das intern?

Gabelmodus

Nehmen Sie den forkModus als grundlegenden Prozess des Laichens. Dadurch können Sie das ändern exec_interpreter, sodass Sie einen phpoder einen pythonServer mit pm2 ausführen können. Ja, dies exec_interpreterist der "Befehl", mit dem der untergeordnete Prozess gestartet wird. Standardmäßig wird PM2 verwenden , nodeso dass pm2 start server.jsso etwas wie zu tun:

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

Dieser Modus ist sehr nützlich, da er viele Möglichkeiten bietet. Sie können beispielsweise mehrere Server an zuvor festgelegten Ports starten, die dann von HAProxy oder Nginx ausgeglichen werden.

Cluster-Modus

Das clusterwird nur mit arbeiten , nodewie es ist , exec_interpreterweil es auf die NodeJS Cluster - Modul zugreifen (zB: isMaster, forkMethoden etc.). Dies ist ideal für die Prozessverwaltung ohne Konfiguration, da der Prozess in mehreren Instanzen automatisch verzweigt wird. Zum Beispiel pm2 start -i 4 server.jswerden 4 Instanzen von gestartet server.jsund das Cluster-Modul den Lastausgleich übernehmen lassen.

Sojuka
quelle
3
Frage basierend auf Ihrer Antwort hier: Ich habe einen Anwendungsfall, den ich haben muss, sagen wir 30 Instanzen meiner node.js-App, die mit einer eindeutigen, vordefinierten Portnummer (: 3000 bis: 3030) erzeugt wurden, und jede Instanz muss a behandeln bestimmte Gruppe von Benutzern, die nur auf ihren zugewiesenen Port zugreifen. Ich möchte also nicht, dass der Master-Prozess einen Lastausgleich durchführt, sondern nur die untergeordneten Prozesse startet (und weiter ausführt). Ist das möglich? Oder wird versucht, die Last nur auf alle erzeugten untergeordneten Prozesse zu verteilen?
Tamak
3
Ich würde die programmatische API pm2 verwenden, um 30 Prozesse in fork_mode zu starten und etwas anderes als Load Balancer zwischen den 30 Ports zu verwenden. Sie können auch pm2 start -i 30 app.jsden nodejs-Cluster verwenden und die Arbeit erledigen lassen.
Sojuka
11
Hinweis: Im cluster modeMaster-Prozess gibt es einen einzelnen Fehlerpunkt.
Karl Pokus
40

Node.js ist Single-Thread.

Dies bedeutet, dass nur 1 Kern Ihrer Intel Quad-Core-CPU die Knotenanwendung ausführen kann.

Es hieß : fork_mode.

Wir verwenden es für lokale Entwickler .

pm2 start server.js -i 0 hilft Ihnen, 1 Knotenthread auf jedem Kern Ihrer CPU auszuführen.

Und automatischer Lastausgleich der zustandslosen kommenden Anforderungen.

Am selben Port .

Wir nennen es : cluster_mode.

Welches für die Leistung in der Produktion verwendet wird .

Sie können dies auch auf einem lokalen Entwickler tun, wenn Sie Ihren PC einem Stresstest unterziehen möchten :)

Haotang
quelle
2
thaks, es klärt viel in meinem Kopf über nodejs
Rishabh Agrawal
1
tolle Erklärung !!
Piqué
1
Node.js ist kein Single-Thread, es gibt (derzeit) einen Userland-Thread, aber es wird sicherlich von einem libuv-Threadpool unterstützt.
Benjamin Gruenbaum
1
@BenjaminGruenbaum Stimme dir zu. Meine Aussage sollte in der Annahme verstanden werden, dass ich nicht zu tief bis auf libuv-Ebene
erwähne
16

Dokumentation und Quellen sind hier wirklich irreführend.

Wenn Sie dies in den Quellen nachlesen, scheinen die einzigen Unterschiede darin zu bestehen, dass sie entweder Knoten clusteroder child_processAPI verwenden. Da clusterletzteres verwendet wird, tun Sie tatsächlich dasselbe. Es gibt nur viel mehr Gewohnheiten, stdiodie im Gasthaus herumlaufen fork_mode. Auch clusterkann nur mit über Strings kommuniziert werden, nicht widerspricht .

Standardmäßig verwenden Sie fork_mode. Wenn Sie die -i [number]Option-bestehen, gehen Sie hinein cluster_mode, auf die Sie im Allgemeinen mit w / abzielen pm2.

Außerdem kann die fork_modeInstanz aufgrund wahrscheinlich nicht denselben Port abhören EADDRINUSE. cluster_modekönnen. Auf diese Weise können Sie Ihre App auch so strukturieren, dass sie auf demselben Port ausgeführt wird, auf dem der Lastausgleich automatisch erfolgt. Sie müssen dann Apps ohne Status erstellen, z. B. Sitzungen, Datenbank.

eljefedelrodeodeljefe
quelle
1
Ich bin immer noch verwirrt. clustereingebautes Modul verwendet child_processintern? und Ihr Vorschlag ist, wenn ich flexibel sein muss stdio, muss ich den Gabel-Modus verwenden?
Jinyoung Kim
Die stdioSache ist etwas von pm2der Umsetzung. Mach dir darüber keine Sorgen. Sie möchten es cluster_modein der Produktion verwenden, da es Ihre Instanz härtet, da -i [number]Instanzen im Hintergrund ausgeführt werden. Verwenden Sie fork_modediese Option, wenn keine Härtung erforderlich ist oder Sie bessere Protokolle und Materialien wünschen.
eljefedelrodeodeljefe
1
cluster_modeVerwendet offensichtlich auch mehr Ressourcen Ihres Systems, da Sie -i [number]Prozesse ausführen.
Eljefedelrodeodeljefe
Obwohl ich Ihre Antwort sehr geschätzt habe, habe ich den Punkt auch jetzt noch nicht verstanden. Die meisten Ihrer Erklärung sind so eine Art natürlicher Dinge (zB CLI Nutzung cluster_mode, Last-Bilanz cluster_mode, cluster_modemehr Ressourcen verbraucht ..). Das ist der Grund, warum ich nicht gewählt habe. Können Sie beide einfachen Anwendungsfälle erklären? Jeder Fall muss vernünftig sein, warum er seinen Modus angenommen hat.
Jinyoung Kim
@eljefedelrodeodeljefe Können Sie mehr über "Sie müssen Apps ohne Status erstellen, obwohl zB Sitzungen, dbs." erklären? Warum sollte die App ohne Status sein?
STEN