Zusammenfassung der Wissenspunkte des Nodejs-Clustermoduls und Anwendungsbeispiele

Zusammenfassung der Wissenspunkte des Nodejs-Clustermoduls und Anwendungsbeispiele

Der Interviewer wird Sie manchmal fragen: „Sagen Sie mir, wie man mehrere Prozesse in NodeJS startet.“ Das Clustermodul sollte Ihnen sofort in den Sinn kommen. Lassen Sie mich Ihnen nun die Verwendung des Clustermoduls erläutern.

Grundlegende Verwendung

Node.js wird standardmäßig als einzelner Prozess ausgeführt und kann bis zu 512 MB Speicher für 32-Bit-Systeme und bis zu 1 GB Speicher für 64-Bit-Systeme verwenden. Bei Computern mit Mehrkern-CPUs ist dies sehr ineffizient, da nur ein Kern läuft und die anderen Kerne im Leerlauf sind. Zur Lösung dieses Problems wird das Clustermodul vorgeschlagen.

Mit dem Clustermodul können Sie einen Masterprozess und mehrere Workerprozesse einrichten, wobei der Masterprozess die Ausführung der Workerprozesse überwacht und koordiniert. Worker verwenden Interprozesskommunikation zum Nachrichtenaustausch. Das Clustermodul verfügt über einen integrierten Lastenausgleich, der den Round-Robin-Algorithmus verwendet, um die Last zwischen Workerprozessen zu koordinieren. Während des Betriebs werden alle neu hergestellten Verbindungen vom Hauptprozess abgeschlossen, und anschließend weist der Hauptprozess die TCP-Verbindung dem angegebenen Arbeitsprozess zu.

var cluster = erfordern('cluster');
var os = erfordern('os');

wenn (cluster.isMaster){
für (var i = 0, n = os.cpus().length; i < n; i += 1){
cluster.fork();
}
} anders {
http.createServer(Funktion(req, res) {
res.writeHead(200);
res.end("hallo Welt\n");
}).listen(8000);
}

Der obige Code ermittelt zunächst, ob der aktuelle Prozess der Masterprozess ist (cluster.isMaster). Wenn ja, erstellt er entsprechend der Anzahl der CPU-Kerne mehrere Worker-Prozesse. Wenn nicht, bedeutet dies, dass der aktuelle Prozess ein Worker-Prozess ist und im Prozess ein Serverprogramm gestartet wird.

Der obige Code hat den Nachteil, dass der Hauptprozess nichts davon weiß, wenn der Arbeitsprozess hängt. Um dieses Problem zu lösen, können Sie Abhörfunktionen für Online-Ereignisse und Exit-Ereignisse im Hauptprozess einsetzen.

var cluster = erfordern('cluster');
 
wenn(cluster.isMaster) {
  var numWorkers = require('os').cpus().length;
  console.log('Master-Cluster wird eingerichtet ' + numWorkers + ' Worker...');
 
  für(var i = 0; i < AnzahlArbeiter; i++) {
    cluster.fork();
  }
 
  cluster.on('online', Funktion(Arbeiter) {
    console.log('Worker ' + worker.process.pid + ' ist online');
  });
 
  cluster.on('exit', Funktion(Arbeiter, Code, Signal) {
    console.log('Worker ' + worker.process.pid + ' ist mit Code: ' + code + ' und Signal: ' + signal abgestürzt);
    console.log('Einen neuen Worker starten');
    cluster.fork();
  });
}

Sobald im obigen Code der Hauptprozess das Exit-Ereignis des Arbeitsprozesses überwacht, wird er einen Arbeitsprozess neu starten. Sobald der Arbeitsprozess erfolgreich gestartet wurde und normal ausgeführt werden kann, wird ein Onlineereignis ausgegeben.

Worker-Objekt

Das Worker-Objekt ist der Rückgabewert von cluster.fork() und stellt einen Worker-Prozess dar.

Seine Eigenschaften und Methoden sind wie folgt.

(1) Arbeiter-ID

worker.id gibt die eindeutige Prozess-ID des aktuellen Workers zurück. Diese Nummer ist gleichzeitig der Indexwert, der auf den aktuellen Prozess in cluster.workers verweist.

(2) Arbeiter.Prozess

Alle Arbeitsprozesse werden mit child_process.fork() erzeugt. Das von child_process.fork() zurückgegebene Objekt wird in worker.process gespeichert. Über diese Eigenschaft können Sie das Prozessobjekt abrufen, in dem sich der Worker befindet.

(3) Arbeiter.senden()

Mit dieser Methode werden Informationen an den untergeordneten Prozess im Hauptprozess gesendet.

wenn (cluster.isMaster) {
  var Arbeiter = cluster.fork();
  worker.send('Hallo zusammen');
} sonst wenn (cluster.isWorker) {
  process.on('Nachricht', Funktion(msg) {
    verarbeiten.senden(Nachricht);
  });
}

Der Zweck des obigen Codes besteht darin, dass der Arbeitsprozess jede vom Hauptprozess gesendete Nachricht wiederholt.

Um im Arbeitsprozess eine Nachricht an den Hauptprozess zu senden, verwenden Sie process.send(message); um die vom Hauptprozess gesendeten Nachrichten abzuhören, verwenden Sie den folgenden Code.

process.on('Nachricht', Funktion(Nachricht) {
  console.log(Nachricht);
});

Die gesendete Nachricht kann eine Zeichenfolge oder ein JSON-Objekt sein. Unten sehen Sie ein Beispiel für das Senden eines JSON-Objekts.

Arbeiter.senden({
  Typ: 'Aufgabe 1',
  von: 'Meister',
  Daten: {
    // die Daten, die Sie übertragen möchten
  }
});

cluster.workers-Objekt

Dieses Objekt ist nur im Hauptprozess verfügbar und umfasst alle Arbeitsprozesse. Der Schlüsselwert jedes Mitglieds ist ein Arbeitsprozessobjekt und der Schlüsselname ist das worker.id-Attribut des Arbeitsprozesses.

socket.on('Daten', Funktion(id) {
  var Arbeiter = Cluster.Arbeiter[id];
});

Eigenschaften und Methoden des Clustermoduls

istMaster,istWorker

Die Eigenschaft isMaster gibt einen Booleschen Wert zurück, der angibt, ob der aktuelle Prozess der Masterprozess ist. Diese Eigenschaft wird durch process.env.NODE_UNIQUE_ID bestimmt. Wenn process.env.NODE_UNIQUE_ID nicht definiert ist, bedeutet dies, dass der Prozess der Hauptprozess ist.

Die Eigenschaft isWorker gibt einen Booleschen Wert zurück, der angibt, ob der aktuelle Prozess ein Arbeitsprozess ist. Es ist das Gegenteil des Wertes der Eigenschaft isMaster.

Gabel()

Mit der Fork-Methode wird ein neuer Arbeitsprozess erstellt und der Kontext wird in den Hauptprozess kopiert. Nur der Hauptprozess kann diese Methode aufrufen.

Diese Methode gibt ein Worker-Objekt zurück.

töten()

Die Kill-Methode wird verwendet, um den Arbeitsprozess zu beenden. Es kann einen einzelnen Parameter akzeptieren, der das Systemsignal darstellt.

Wenn der aktuelle Prozess der Hauptprozess ist, beendet er die Verbindung mit worker.process und sendet dann die Systemsignalmethode an den Worker-Prozess. Wenn es sich bei dem aktuellen Prozess um einen Arbeitsprozess handelt, wird die Kommunikation mit dem Hauptprozess beendet, anschließend beendet und 0 zurückgegeben.

In früheren Versionen wurde diese Methode auch worker.destroy() genannt.

Hörereignis

Nachdem der Arbeitsprozess die Abhörmethode aufgerufen hat, wird das Ereignis „Abhören“ an den Server des Prozesses und dann an den Hauptprozess übertragen.

Die Rückruffunktion dieses Ereignisses akzeptiert zwei Parameter, einer ist das aktuelle Worker-Objekt und der andere ist das Adressobjekt, das Informationen wie URL, Port, Adresstyp (IPv4, IPv6, Unix-Socket, UDP) usw. enthält. Dies ist nützlich für Node-Anwendungen, die mehrere URLs bedienen.

Node-Dienst ohne Unterbrechung neu starten

Um den Dienst neu zu starten, müssen Sie ihn herunterfahren und dann erneut starten. Mit dem Clustermodul können Sie zuerst einen Arbeitsprozess starten und dann alle ursprünglichen Arbeitprozesse herunterfahren. Dadurch können Sie den Node-Dienst ohne Unterbrechung neu starten.

Zuerst sendet der Masterprozess ein Neustartsignal an den Workerprozess.

Arbeiter[wid].send({Typ: 'shutdown', von: 'master'});

Der Arbeitsprozess überwacht das Nachrichtenereignis und wird beendet, sobald er feststellt, dass der Inhalt heruntergefahren ist.

process.on('Nachricht', Funktion(Nachricht) {
  wenn(Nachricht.Typ === 'Herunterfahren') {
    Prozess.Beenden(0);
  }
});

Unten finden Sie eine Funktion, die alle Arbeitsprozesse beendet.

Funktion restartWorkers() {
  var wid, workerIds = [];
  für (wid in cluster.workers) {
    workerIds.push(wid);
  }
 
  workerIds.forEach(Funktion(wid) {
    cluster.workers[wid].send({
      Text: 'Herunterfahren',
      von: 'Meister'
     });
    setzeTimeout(Funktion() {
      wenn (cluster.workers[wid]) {
        cluster.workers[wid].kill('SIGKILL');
      }
    }, 5000);
  });
};

PM2 Module

Das PM2-Modul ist ein Wrapper um das Cluster-Modul. Seine Funktion besteht darin, das Clustermodul so weit wie möglich zu abstrahieren, sodass Benutzer Multiprozess-Node-Anwendungen bereitstellen können, als würden sie einen einzelnen Prozess verwenden.

// app.js
var http = erforderlich('http');
 
http.createServer(Funktion(req, res) {
  res.writeHead(200);
  res.end("hallo Welt");
}).listen(8080);

Führen Sie diesen Code von der Befehlszeile mit PM2 aus

$ pm2 starte app.js -i 4

Der i-Parameter im obigen Code teilt PM2 mit, dass dieser Code im Clustermodus gestartet werden soll und die Anzahl der neuen Arbeitsprozesse 4 beträgt. Wenn der Wert des i-Parameters 0 ist, startet PM2 mehrere Arbeitsprozesse, abhängig davon, wie viele CPU-Kerne die aktuelle Maschine hat.

Wenn ein Arbeitsprozess aus irgendeinem Grund beendet wird, wird er sofort neu gestartet.

# Starten Sie alle Arbeitsprozesse neu $ pm2 reload all

Jeder Arbeitsprozess hat eine ID. Mit dem folgenden Befehl können Sie die Details eines einzelnen Arbeitsprozesses anzeigen.

$ pm2 show <Arbeiter-ID>

Beim Herunterfahren des Arbeitsprozesses können Sie den folgenden Code einsetzen, damit der Arbeitsprozess auf die Herunterfahrmeldung hört. Sobald Sie diese Nachricht erhalten haben, führen Sie die letzten Bereinigungsarbeiten durch und schließen Sie sie

process.on('Nachricht', Funktion(msg) {
  wenn (msg === 'Herunterfahren') {
    alle_verbindungen_schließen();
    lösche_logs();
    server.close();
    Prozess.Beenden(0);
  }
});

Dies ist das Ende dieses Artikels mit der Zusammenfassung der Wissenspunkte und Anwendungsbeispiele zum Nodejs-Clustermodul. Weitere Informationen zum Nodejs-Clustermodul finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

<<:  Anweisung zur Ermittlung der Browserversion und Kompatibilität mit mehreren Browsern

>>:  Ein Beispiel für die Implementierung eines adaptiven Quadrats mit CSS

Artikel empfehlen

Detaillierte Analyse der Kompilierung und Installation von vsFTP 3.0.3

Details zur Sicherheitsanfälligkeit VSFTP ist ein...

Lösung für den Fehler 1045, wenn Navicat eine Verbindung zu MySQL herstellt

Beim Herstellen einer Verbindung mit der lokalen ...

So implementieren Sie eine verschachtelte if-Methode in Nginx

Nginx unterstützt weder verschachtelte if-Anweisu...

CentOS 7.2 erstellt einen Nginx-Webserver zum Bereitstellen des Uniapp-Projekts

Panther begann als Anfänger und ich bin immer noc...

Grafisches Tutorial zur Installation von MySQL 8.0.15 und Datenbankgrundlagen

Die Installation der MySQL-Software und die Daten...

Ausführliche Erklärung des Binlogs in MySQL 8.0

1 Einleitung Das Binärprotokoll zeichnet SQL-Anwe...

Ungewöhnliche, aber nützliche Tags in Xhtml

Xhtml hat viele Tags, die nicht häufig verwendet w...

So installieren Sie Postgres 12 + pgadmin im lokalen Docker (unterstützt Apple M1)

Inhaltsverzeichnis einführen Unterstützt Intel-CP...

So konfigurieren Sie den Runner-Container in Docker

1. Erstellen Sie einen Runner-Container mk@mk-pc:...

Fehler mit ungerader Breite und Höhe in IE6

Wie in der Abbildung gezeigt: Aber bei der Anzeig...