Node.js-Cluster-Modul
von Node.jsclusterDas Modul ermöglicht es Ihnen, einfach Worker-Prozesse zu erstellen, die denselben Server-Port gemeinsam nutzen. Da Node.js single-threaded ist,clusterDas Modul kann uns helfen, die Leistung von Multi-Core-CPU-Systemen voll auszuschöpfen.
Einfach ausgedrückt,clusterDas Modul ist wie ein Restaurantmanager: Es erstellt mehrere Kellner (Worker), um Kunden (Anfragen) zu bedienen, anstatt einen Kellner alle Kunden bedienen zu lassen.
Warum brauchen Sie das Cluster-Modul?
Leistung verbessern: Moderne CPUs haben normalerweise mehrere Kerne, aber Node.js verwendet standardmäßig nur einen Kern.
clusterDas Modul ermöglicht es Ihnen, alle verfügbaren CPU-Kerne zu nutzen.Zuverlässigkeit verbessern: Wenn ein Worker abstürzt, können andere Worker weiterhin Anfragen bearbeiten, und der Master-Prozess kann den abgestürzten Worker neu starten.
Keine Ausfallzeit: Sie können Worker nacheinander neu starten, um Code zu aktualisieren, ohne den Dienst zu unterbrechen.
Grundlegende Verwendung des Cluster-Moduls
Beispiel
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master-Prozess ${process.pid}läuft`);
// Worker-Prozesse forken
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid}wurde beendet`);
});
} else {
// Worker können dieselbe TCP-Verbindung gemeinsam nutzen
// Dies ist ein HTTP-Server
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hallo Welt\n');
}).listen(8000);
console.log(`Worker ${process.pid}wurde gestartet`);
}
Analyse der Kernkonzepte
Master-Prozess
- Verantwortlich für die Verwaltung aller Worker-Prozesse
- Verarbeitet normalerweise keine tatsächlichen Anfragen
- Kann verschiedene Worker-Events abhören
Worker-Prozess
- Child-Prozesse, die Anfragen tatsächlich verarbeiten
- Jeder Worker ist ein unabhängiger Node.js-Prozess
- Teilen denselben Server-Port
Gängige APIs des Cluster-Moduls
cluster.fork()
Erstellt einen neuen Worker-Prozess. Der Aufruf dieser Methode gibt ein Worker-Objekt zurück.
cluster.isMaster
Wenn es der Master-Prozess ist, dann ist estrue。
cluster.isWorker
Wenn es ein Worker-Prozess ist, dann ist estrue。
cluster.workers
Eine Hash-Tabelle, die alle aktiven Worker-Objekte enthält, mitworker.idals Schlüsselname.
Praktische Anwendungsszenarien
1. Lastverteilung
Beispiel
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
require('./app'); // Deine Anwendungs-Einstiegsdatei
}
2. Sanfter Neustart
Beispiel
console.log(`Worker ${worker.process.pid}beendet`);
// Du kannst hier einen neuen Worker forken
cluster.fork();
});
3. Interprozesskommunikation
Beispiel
worker.send('Hallo Worker!');
// Der Worker empfängt die Nachricht
process.on('message', (msg) => {
console.log(`Worker ${process.pid}Nachricht empfangen: ${msg}`);
});
Tipps zur Leistungsoptimierung
Worker basierend auf der Anzahl der CPU-Kerne erstellen: Üblicherweise wird empfohlen, dass die Anzahl der Worker der Anzahl der CPU-Kerne entspricht.
Gemeinsam genutzter Port: Alle Worker teilen denselben Port, und das Betriebssystem verteilt Anfragen automatisch auf verschiedene Worker.
Gemeinsam genutzte Verbindungen: Bei langlebigen Verbindungen (wie WebSocket) müssen Sie berücksichtigen, wie Verbindungen auf verschiedene Worker verteilt werden.
Gemeinsam genutzter Zustand: Worker teilen keinen Speicher, daher müssen Sie externen Speicher wie Redis verwenden, um den Zustand zu teilen.
Häufige Probleme und Lösungen
1. Speicherleck
Jeder Worker ist ein unabhängiger Prozess. Ein Speicherleck in einem Worker wirkt sich nicht auf andere Worker aus, aber Sie müssen fehlerhafte Worker überwachen und neu starten.
2. Sitzungspersistenz
Wenn Sitzungspersistenz erforderlich ist, können Sie Sticky Sessions verwenden oder Sitzungsdaten extern speichern (z. B. Redis).
3. Dateideskriptor-Limit
Eine große Anzahl von Workern kann Dateideskriptoren erschöpfen, daher müssen Sie die Systemlimits anpassen:
Beispiel
Alternativen zum Cluster-Modul
ObwohlclusterDas Modul ist leistungsstark, aber es gibt andere Optionen:
- PM2: Prozessmanager mit integrierten Lastverteilungs- und Überwachungsfunktionen
- Nginx: Ein Reverse-Proxy, der Lastverteilung über mehrere Node.js-Instanzen hinweg betreiben kann
- Kubernete: Ein Container-Orchestrierungssystem, das Node.js-Dienste automatisch skalieren kann
Zusammenfassung
von Node.jsclusterDas Modul ist ein wichtiges Werkzeug für den Aufbau leistungsstarker, hochverfügbarer Netzwerkdienste. Durch die Erstellung mehrerer Worker-Prozesse können wir:
- Die Leistung von Multi-Core-CPUs voll ausschöpfen
- Die Zuverlässigkeit der Anwendung verbessern
- Zero-Downtime-Deployment erreichen
Obwohl das Einrichten und Verwalten von Multi-Prozess-Anwendungen komplexer ist als bei Single-Prozess, ist für Produktions-Node.js-Anwendungen die VerwendungclusterDas Modul oder ähnliche Lösungen sind nahezu unverzichtbar.
Ich hoffe, dieser Leitfaden hilft Ihnen, Node.js's zu verstehen und zu nutzenclusterModul!
Node.js integrierte Module