Die meisten Node.JS Skripte beginnen mit der Initialisierung und dem Starten eines HTTP-Servers. Doch so einfach dies in Node.JS auch implementiert ist, fehlen einem HTTP-/Webserver damit noch immer wichtige Eigenschaften:
– Lastverteilung
– Ausfallsicherheit
– Neustarten bei Anwendungsfehlern
Das Erstellen eines Node.JS Cluster, das alle drei aufgelisteten Eigenschaften umsetzt ist ebenso einfach wie das Starten eine HTTP-Servers!
Seit Node.JS 0.6 ist das Cluster Module enthalten, welches das Ausführung und Überwachen von mehreren Instanzen ermöglicht.
Da Node.JS generell nur einen Prozess mit einem einzigen Thread startet, stellt sich die Frage wie das Clustern bzw. das Balancing von Lastspitzen von statten gehen soll.
Bei der Verwendung des Cluster Moduls wird zwischen Master und Worker Instanzen gesprochen. Die Instanz die auf der Shell mittels node myServer.js bzw. forever start myServer.js (siehe Node.JS: Run as a service), wird als die Master Instanz bezeichnet welche sich um die Initialisierung und Überwachung der Worker Instanzen kümmert.
Es wird empfohlen, exakt so viele Worker Instanzen zu starten wie CPU Kerne auf dem Server vorhanden sind. So kann jeder Prozess/Thread auf genau einer dedizierten CPU ausgeführt werden.
var cluster = require('cluster'); var cpuCores = require('os').cpu().length; // Anzahl CPU Kerne aus dem OS Module if (cluster.isMaster) { for (int i=0; i<cpuCores; i++) { cluster.fork(); } } else { http.createServer(function(req, res) { // ... }).listen(8080); }
Damit laufen nun zwar alle Worker Instanzen auf dem selben Port, Node.JS kümmert sich aber im Hintergrund um eine intelligente Verteilung der Anfragen. Sollte eine Worker Instanz jedoch aufgrund eines Anwendungsfehlers abstürzen, wird diese nicht automatisch neugestartet. Dafür müssen wir das exit-Event überwachen.
// ... cluster.on('exit', function(worker) { cluster.fork(); // Eine neue Worker Instanz staten });
In Verbindung mit dem Node.JS Module forever bzw. forever ist dies eine lastverteilende und ausfallsichere Methode ein produktives Node.JS Skript zu deployen.
0 Comments