Master-Worker Pattern in NodeJS: Alles, was Sie wissen müssen
Wenhao Wang
Dev Intern · Leapcell

NodeJS ist eine Entwicklungsplattform, die auf JavaScript basiert und es Entwicklern ermöglicht, serverseitige Anwendungen mit JavaScript zu schreiben. Eine der Hauptfunktionen von NodeJS ist sein Single-Threaded-, Event-Driven-Modell, das eine effiziente Bearbeitung zahlreicher gleichzeitiger Anfragen ermöglicht, ohne dass mehrere Threads oder Prozesse erforderlich sind.
Warum das Master-Worker-Pattern verwenden
Die Single-Threaded-Natur von NodeJS hat jedoch ihre Grenzen, wie zum Beispiel:
- CPU-intensive Aufgaben: Bei Aufgaben wie Bildverarbeitung oder Verschlüsselung/Entschlüsselung kann der einzelne Thread andere Anfragen blockieren, was zu Leistungseinbußen führt.
- Fehlerbehandlung: Wenn ein Fehler oder eine Ausnahme auftritt, kann der einzelne Thread abstürzen, wodurch die gesamte Anwendung nicht mehr ausgeführt wird.
- Multi-Core-Auslastung: Das Single-Threaded-Modell kann Multi-Core-CPUs nicht vollständig ausnutzen.
Um diese Probleme zu beheben, bietet NodeJS ein Master-Worker-Pattern, auch bekannt als Cluster-Modus, an. Dieses verteilte Systemdesignmuster besteht aus einem Masterprozess und mehreren Workerprozessen. Der Masterprozess verwaltet und überwacht die Worker, während die Worker spezifische Geschäftslogik verarbeiten.
So implementieren Sie das Master-Worker-Pattern
In NodeJS kann das Master-Worker-Pattern mit dem cluster
-Modul implementiert werden. Dieses Modul ermöglicht es Entwicklern, auf einfache Weise mehrere Child-Prozesse zu erstellen und bietet Methoden und Ereignisse zur Steuerung und Kommunikation. Die grundlegenden Schritte zur Verwendung des cluster
-Moduls sind:
- Importieren Sie das
cluster
-Modul und bestimmen Sie, ob der aktuelle Prozess der Master oder ein Worker ist. - Wenn es sich um den Master handelt, verwenden Sie die Methode
cluster.fork()
, um mehrere Workerprozesse zu erstellen und Ereignisse zu binden, um deren Status und Nachrichten zu überwachen. - Wenn es sich um einen Worker handelt, führen Sie die spezifische Geschäftslogik aus und senden Sie Nachrichten mit
process.send()
an den Masterprozess.
Grundlegende Verwendung
Hier ist ein einfaches Beispiel für die Verwendung des cluster
-Moduls:
const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Fork workers. for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); }); } else { // Workers can share any TCP connection. // In this case, it is an HTTP server. http .createServer((req, res) => { res.writeHead(200); res.end('Hello from Worker!'); }) .listen(8000); console.log(`Worker ${process.pid} started`); }
In diesem Code prüft der Masterprozess zunächst, ob er der Master ist (cluster.isMaster
). Wenn dies zutrifft, erstellt er so viele Worker, wie die CPU-Kernanzahl des Systems zulässt. Jeder Worker ist eine unabhängige Instanz des Masterprozesses mit eigenem Speicher und eigener V8-Instanz. Die Worker erstellen einen HTTP-Server mit http.createServer
und beginnen, auf Anfragen zu warten.
Wenn ein Worker abstürzt oder beendet wird, wird das exit
-Ereignis ausgelöst, sodass der Master den Worker neu starten kann.
Erweiterte Verwendung: Integration mit Nginx Load Balancing
Verwenden Sie Nginx als Reverse-Proxy und Load Balancer. Nginx kann eingehende Anfragen auf mehrere Node.js-Prozesse verteilen.
Nginx-Konfigurationsbeispiel:
http { upstream node_cluster { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; # ... other Node.js processes } server { listen 80; location / { proxy_pass http://node_cluster; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } }
In dieser Konfiguration verteilt Nginx eingehende Anfragen gleichmäßig auf die in node_cluster
definierten Node.js-Prozesse.
Vorteile der Verwendung des Master-Worker-Patterns
- Load Balancing: Durch das Ausführen mehrerer Node.js-Prozesse auf einem einzelnen Server wird sichergestellt, dass eingehende Anfragen gleichmäßig verteilt werden, wodurch der Durchsatz erhöht wird.
- Fehlertoleranz und hohe Verfügbarkeit: Wenn ein Worker abstürzt, kann der Master ihn neu starten, ohne andere Worker zu beeinträchtigen.
- CPU-intensive Aufgaben: Mehrere Worker können CPU-intensive Aufgaben verarbeiten und verhindern, dass der Haupt-Thread blockiert wird.
Überlegungen
- Statusfreigabe: Jeder Workerprozess ist unabhängig und gibt keinen Speicher frei. Wenn Ihre Anwendung eine Statusfreigabe erfordert (z. B. Sitzungsstatus), müssen Sie externe Dienste oder Datenbanken verwenden.
Zusammenfassend lässt sich sagen, dass das Master-Worker-Pattern von Node.js, das über das cluster
-Modul implementiert wird, eine einfache, aber leistungsstarke Möglichkeit bietet, Mehrprozessanwendungen zu erstellen und so die Leistung und Zuverlässigkeit zu verbessern.
Wir sind Leapcell, Ihre erste Wahl für das Hosten von Node.js-Projekten
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Language-Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 US-Dollar unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und Protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein Betriebsaufwand – konzentrieren Sie sich einfach auf den Aufbau.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ