Node.JS: Cluster & Load Balancing

Veröffentlicht von Sascha am

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.

Kategorien: Allgemein

Kommentar verfassen

%d Bloggern gefällt das:

Durch das Fortsetzen der Benutzung dieser Seite, stimmst du der Benutzung von Cookies zu. Weitere Informationen

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter.

Schließen