Heim >Web-Frontend >js-Tutorial >So vereinfachen Sie das Node.js-Clustering mit PM2

So vereinfachen Sie das Node.js-Clustering mit PM2

小云云
小云云Original
2017-12-21 09:19:301757Durchsuche

Wie wir alle wissen, läuft Node.js auf der JavaScript-Laufzeitplattform von Chrome, die wir elegant als V8-Engine bezeichnen. Sowohl die V8-Engine als auch spätere Node.js laufen im Single-Thread-Modus, sodass sie ihre Leistung in Multi-Core-Prozessorsystemen nicht maximieren können. In diesem Artikel wird hauptsächlich ausführlich vorgestellt, wie man PM2 verwendet, um das Node.js-Clustering zu vereinfachen. Der Herausgeber findet es ziemlich gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz geben. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

Das Cluster-Modul von Node.js

Glücklicherweise stellt uns Node.js das Cluster-Modul zur Verfügung, das mehrere Worker-Threads generieren kann, um dieselbe TCP-Verbindung zu teilen.

Wie funktioniert es?

Zuerst erstellt Cluster einen Master und repliziert dann mehrere Server-Apps (auch Worker-Threads genannt) entsprechend der von Ihnen angegebenen Anzahl. Es kommuniziert mit Arbeitsthreads über IPC-Kanäle und verwendet einen integrierten Lastausgleich, um den Druck zwischen Threads besser zu bewältigen. Der Lastausgleich verwendet den Round-Robin-Algorithmus (auch als Round-Robin-Algorithmus bezeichnet).

Bei Verwendung der Round-Robin-Planungsstrategie akzeptiert () der Master alle eingehenden Verbindungsanforderungen und sendet dann die entsprechende TCP-Anforderungsverarbeitung an den ausgewählten Arbeitsthread (diese Methode kommuniziert weiterhin über IPC).

Wie benutzt man es?

Hier ist ein einfaches Beispiel:

var cluster = require('cluster'); 
var http  = require('http'); 
var os   = require('os');

var numCPUs = os.cpus().length;

if (cluster.isMaster) { 
 // Master:
 // Let's fork as many workers as you have CPU cores

 for (var i = 0; i < numCPUs; ++i) {
  cluster.fork();
 }
} else {
 // Worker:
 // Let&#39;s spawn a HTTP server
 // (Workers can share any TCP connection.
 // In this case its a HTTP server)

 http.createServer(function(req, res) {
  res.writeHead(200);
  res.end("hello world");
 }).listen(8080);
}

Natürlich können Sie eine beliebige Anzahl von Worker-Threads angeben, die Anzahl der Threads ist nicht auf die Anzahl der CPU-Kerne beschränkt, da sie einfach ist läuft als Child-Thread auf der CPU.

Wie Sie sehen, müssen Sie Ihren Code in die Verarbeitungslogik des Clusters kapseln und zusätzlichen Code hinzufügen, um anzugeben, was zu tun ist, wenn ein Thread hängt.

So verwenden Sie PM2

Der integrierte Cluster

PM2 enthält intern die gesamte oben genannte Verarbeitungslogik, sodass Sie keine Änderungen am Code vornehmen müssen. Wir stellen den obigen Code in seiner ursprünglichen Form wieder her:

var http = require(&#39;http&#39;);

http.createServer(function(req, res) { 
 res.writeHead(200);
 res.end("hello world");
}).listen(8080);

und führen ihn dann auf der Konsole aus:

$ pm2 start app.js -i 4

-i PM2 führt Ihre App in der Form „cluster_mode“ aus (der entsprechende Name ist fork_mode), und die folgende Zahl gibt die Anzahl der zu startenden Arbeitsthreads an. Wenn die angegebene Zahl 0 ist, generiert PM2 entsprechende Arbeitsthreads basierend auf der Anzahl Ihrer CPU-Kerne.

Halten Sie Ihre Apps in jeder Situation am Laufen

Wenn ein Arbeitsthread hängen bleibt, machen Sie sich keine Sorgen, PM2 startet ihn sofort neu. Natürlich können Sie diese Threads auch jederzeit manuell neu starten:

Cluster in Echtzeit erweitern

Jederzeit, wenn Sie eine Vergrößerung benötigen die Anzahl der Worker-Threads. Der Cluster kann durch PM2-Skala erweitert werden. Der Parameter gibt die Anzahl der Worker-Threads an und wird verwendet, um die Anzahl der Cluster zu erhöhen oder zu verringern. Sie können auch über die PM2 Scale App +3 angeben, wie viele Worker-Threads hinzugefügt werden sollen.

Erzielung von Updates ohne Ausfallzeiten in der Produktionsumgebung

Die Reload-Funktion von PM2 startet alle Arbeitsthreads nacheinander neu. Jeder Thread wartet auf die Erstellung eines neuen Threads, bevor er beendet wird. Wenn Sie also neuen Code in einer Produktionsumgebung bereitstellen, läuft der Server ohne Unterbrechung weiter.

Die Verwendung der Funktion „gracefulReload“ kann den gleichen Zweck erreichen. Der Unterschied besteht darin, dass der Arbeitsthread nicht sofort beendet wird, sondern ein Shutdown-Signal über IPC gesendet wird, um alle aktuellen Verbindungen zu schließen und einige benutzerdefinierte Aufgaben zu bearbeiten, und dann ordnungsgemäß beendet wird . Zum Beispiel der folgende Code:

process.on('message', function(msg) { 
 if (msg === 'shutdown') {
  close_all_connections();
  delete_cache();
  server.close();
  process.exit(0);
 }
});

PM2 so konfigurieren, dass er automatisch startet

Wenn Sie möchten, dass PM2 nach dem Neustart des Servers automatisch die vorherige Anwendung ausführt, können Sie Ihre Anwendung zunächst über pm2 starten Starten Sie und führen Sie dann den folgenden Befehl aus:

pm2 save

Dadurch wird eine Datei dump.pm2 im Verzeichnis ~/.pm2 generiert, die alle derzeit auf PM2 ausgeführten Anwendungen beschreibt. Führen Sie dann den Befehl aus:

pm2 startup [platform]

Beachten Sie, dass der optionale Parameter platform hinzugefügt werden muss, um pm2 klar über die aktuelle Systemumgebung zu informieren. Auf diese Weise führt PM2 beim nächsten Neustart des Servers automatisch die zuvor gespeicherte Anwendung aus.

Fazit

Das Cluster-Modul ist sehr leistungsstark und die Verwendung von PM2 wird es einfacher machen. In der Node 0.10.x-Ära war Cluster.js noch ein experimentelles Produkt, aber ab Node 0.11.x ist es allmählich ausgereift und bereitet sich auf die offizielle Veröffentlichung vor, einschließlich der Node 0.12.x-Version. Es wird dringend empfohlen, die neuesten Versionen von Node.js und PM2 zu verwenden. Die Mitwirkenden dieser Produkte arbeiten ständig hart daran, sie zu verbessern.

Verwandte Empfehlungen:

Vollständige Aufzeichnung der Redis-Clusterkonstruktion

10 empfohlene Artikel zur Clusterbereitstellung

Eine kurze Einführung in den MySQL-Cluster (Bild)

Das obige ist der detaillierte Inhalt vonSo vereinfachen Sie das Node.js-Clustering mit PM2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn