Kernpunkte
node.js wird als serverseitige laufende Umgebung immer beliebter, insbesondere in Websites mit hohem Handel, und Statistiken beweisen dies auch. Darüber hinaus macht die Verfügbarkeit zahlreicher Frameworks eine gute Umgebung für schnelle Prototypen. Node.js verfügt über eine ereignisgesteuerte Architektur, die eine nicht blockierende E/A-API verwendet, um eine asynchrone Bearbeitung von Anforderungen zu ermöglichen. Ein wichtiges und oft übersehenes Merkmal von Node.js ist seine Skalierbarkeit. In der Tat ist dies der Hauptgrund, warum einige große Unternehmen Node.js (wie Microsoft, Yahoo, Uber und Walmart) in ihre Plattformen integrieren und ihre serverseitigen Vorgänge sogar vollständig auf Node.js migrieren (wie Paypal, eBay und Groupon). Jeder Node.js-Prozess wird in einem einzigen Thread ausgeführt. Standardmäßig beträgt das Speichergrenze für 32-Bit-Systeme 512 MB und die Speichergrenze für 64-Bit-Systeme 1 GB. Während die Speichergrenze auf 32-Bit-Systemen auf etwa 1 GB erhöht werden kann und auf 64-Bit-Systemen auf etwa 1,7 GB gestellt werden kann, können Speicher- und Verarbeitungsleistung immer noch ein Engpass für verschiedene Prozesse sein. Die elegante Lösung, die Node.js für erweiterte Anwendungen vorsieht, besteht darin, einen einzelnen Prozess in mehrere Prozesse oder Arbeitsprozesse in der terminologie node.js aufzuteilen. Dies kann durch das Clustermodul erreicht werden. Mit dem Cluster -Modul können Sie untergeordnete Prozesse (Arbeitsprozesse) erstellen, die alle Serverports mit dem Hauptknotenprozess (Hauptprozess) freigeben. In diesem Artikel lernen Sie, wie Sie einen Node.js -Cluster erstellen, um Ihre Anwendung zu beschleunigen. Cluster ist ein Pool ähnlicher Arbeitsprozesse, die unter dem übergeordneten Knotenprozess ausgeführt werden. Arbeitsprozesse werden unter Verwendung der Fork () -Methode des Moduls Child_Processes generiert. Dies bedeutet, dass der Arbeitsprozess den Server -Handle freigeben und mit dem übergeordneten Knotenprozess mithilfe von IPC (Interprocess Communication) kommunizieren kann. Der Hauptprozess ist für die Start und Kontrolle des Arbeitsprozesses verantwortlich. Sie können so viele Arbeiterprozesse erstellen, wie Sie im Hauptprozess möchten. Denken Sie auch daran, dass eingehende Verbindungen standardmäßig die Umfragen zwischen Arbeitsprozessen (außer Windows) zugewiesen werden. Tatsächlich gibt es eine andere Möglichkeit, eingehende Verbindungen zuzuordnen, die ich hier nicht diskutieren werde, und die Zuordnung an das Betriebssystem (die Standardeinstellung in Windows) übergeben. In der Dokumentation von Node.js wird empfohlen, den Standardabfragestil als Planungsrichtlinie zu verwenden. Obwohl die Verwendung eines Clustermoduls theoretisch kompliziert klingt, ist seine Implementierung sehr einfach. Um es mit der Verwendung zu beginnen, müssen Sie es in Ihre Node.js -Anwendung aufnehmen: Das Clustermodul führt denselben Node.js -Prozess mehrmals aus. Das erste, was Sie tun müssen, ist zu bestimmen, welcher Teil des Codes für den Hauptprozess verwendet wird und welcher Teil des Codes für den Arbeitsprozess verwendet wird. Mit dem Cluster -Modul können Sie den Hauptprozess wie folgt identifizieren: Der Hauptprozess ist der Prozess, den Sie gestartet haben und der wiederum den Arbeitsprozess initialisiert. Um den Arbeitsprozess im Hauptprozess zu starten, verwenden wir die fork () -Methode: Diese Methode gibt ein Worker -Objekt zurück, das einige Methoden und Eigenschaften über den abgeleiteten Arbeiter enthält. Wir werden einige Beispiele im nächsten Abschnitt sehen. Das Clustermodul enthält mehrere Ereignisse. Zwei gängige Veranstaltungen im Zusammenhang mit dem Start- und Kündigungsmomenten des Arbeiterprozesses sind die Online- und Ausstiegsereignisse. Wenn der Arbeitsprozess abgeleitet ist und eine Online -Nachricht sendet, wird eine Online -Veranstaltung abgeleitet. Wenn der Arbeitsprozess stirbt, wird ein Exit -Ereignis emittiert. Später lernen wir, wie Sie diese beiden Ereignisse verwenden, um den Lebenszyklus eines Arbeitsprozesses zu kontrollieren. Lassen Sie uns nun alles zusammenstellen, was wir bisher gesehen haben und ein komplettes Beispiel zeigen. Beispiel Dieser Abschnitt enthält zwei Beispiele. Das erste Beispiel ist eine einfache Anwendung, die zeigt, wie Cluster -Module in einer Node.js -Anwendung verwendet werden. Das zweite Beispiel ist ein Express-Server, der das Clustermodul von Node.js nutzt, das Teil des Produktionscode ist, das ich normalerweise in groß angelegten Projekten verwende. Beide Beispiele können von GitHub heruntergeladen werden.
Sie können auf die URL zugreifen, indem Sie den Server starten (Ausführen des Befehlsknotens Simple.js) und auf die URL https://www.php.cn/link/7d2d180c45c41870f36e747816456190 Express ist eines der beliebtesten Webanwendungs -Frameworks für Node.js (wenn nicht das beliebteste). Wir haben es mehrmals auf dieser Website behandelt. Wenn Sie mehr erfahren möchten, empfehle ich Ihnen, die Artikel "Erstellen einer erholsamen API mit Express 4" und "Erstellen eines node.js-gesteuerten Chatroom-Webantrags: Express und Azure" zu lesen. Das zweite Beispiel zeigt, wie ein hochskalierbarer Express -Server entwickelt wird. Es zeigt auch, wie ein einzelner Prozessserver migriert, um ein Clustermodul mit einer kleinen Menge Code zu nutzen. Die erste Ergänzung dieses Beispiels ist die Verwendung des OS -Moduls von Node.js, um die Anzahl der CPU -Kerne zu erhalten. Das Betriebssystemmodul enthält eine CPUS () -Funktion, die ein Array von CPU -Kernen zurückgibt. Mit diesem Ansatz können wir die Anzahl der Arbeitsprozesse dynamisch bestimmen, um basierend auf Serverspezifikationen abzuleiten, um die Verwendung von Ressourcen zu maximieren. Die zweite und wichtigere Ergänzung ist es, mit dem Tod des Arbeitsprozesses umzugehen. Wenn der Arbeitsprozess stirbt, gibt das Cluster -Modul ein Exit -Ereignis aus. Es kann verarbeitet werden, indem das Ereignis zu hören und eine Rückruffunktion auszuführen, wenn sie emittiert wird. Sie können dies tun, indem Sie Aussagen wie cluster.on ('Exit', Callback) schreiben; In der Rückruffunktion leiten wir einen neuen Arbeiterprozess ab, um die erwartete Anzahl von Arbeitsprozessen beizubehalten. Dies ermöglicht es uns, die Anwendung auch mit einigen unberechtigten Ausnahmen laufen zu lassen. In diesem Beispiel habe ich auch einen Hörer für das Online -Ereignis eingerichtet, das nach dem Abschluss des Arbeitsprozesses abgeleitet wird und eingehende Anfragen erhalten. Dies kann zur Protokollierung oder anderer Operationen verwendet werden. Es gibt mehrere Tools, um die API zu bewerten, aber hier verwende ich das Apache -Benchmark -Tool, um zu analysieren, wie sich die Verwendung von Clustermodulen auf die Leistung der Anwendung auswirkt. Um die Tests einzurichten, habe ich einen Express -Server mit einer Route und einer Rückruffunktion für diese Route entwickelt. Führen Sie in der Rückruffunktion eine virtuelle Operation durch und geben Sie eine Kurznachricht zurück. Es gibt zwei Versionen des Servers: Einer hat keinen Arbeitsprozess, bei dem alle Vorgänge im Hauptprozess stattfinden und der andere 8 Arbeitsprozesse (weil meine Maschine über 8 Kerne verfügt). Die folgende Tabelle zeigt, wie das Merge -Cluster -Modul die Anzahl der verarbeiteten Anforderungen pro Sekunde erhöht. (Anzahl der pro Sekunde verarbeiteten Anforderungen) erweiterter Betrieb Während der Verwendung von Clustermodulen relativ einfach ist, können Sie Arbeitsprozesse verwenden, um andere Vorgänge auszuführen. Beispielsweise können Sie Cluster -Module verwenden, um (fast!) Null -Ausfallzeit für Ihre Anwendung zu erreichen. Wir werden in einer Weile lernen, wie man einige dieser Operationen durchführt. Manchmal müssen Sie möglicherweise eine Nachricht vom Hauptprozess an den Arbeitsprozess senden, um Aufgaben zuzuweisen oder andere Aktionen auszuführen. Im Gegenzug muss der Arbeitsprozess möglicherweise den Hauptprozess, den die Aufgabe abgeschlossen hat, benachrichtigen. Um nach Nachrichten zu hören, sollten Sie den Ereignishörer für das Nachrichtenereignis sowohl im Hauptprozess als auch im Arbeitsprozess festlegen: Arbeiterobjekt ist eine Referenz, die von der Fork () -Methode zurückgegeben wird. Nachrichten aus dem Hauptprozess im Arbeitsprozess anhören: Nachricht kann eine Zeichenfolge oder ein JSON -Objekt sein. Um Nachrichten an einen bestimmten Arbeiterprozess zu senden, können Sie Code wie folgt schreiben: In ähnlicher Weise können Sie eine Nachricht an den Hauptprozess senden: In node.js sind Nachrichten generisch und haben keine spezifischen Typen. Daher ist es am besten, eine Nachricht als JSON -Objekt zu senden, das einige Informationen über den Nachrichtentyp, den Absender und den Inhalt selbst enthält. Zum Beispiel: Eine Sache, die hier zu beachten ist, ist, dass der Message -Ereignis -Rückruf asynchron verarbeitet wird. Es gibt keine definierte Ausführungsreihenfolge. Sie können ein vollständiges Beispiel für die Kommunikation zwischen dem Hauptprozess und dem Arbeiterprozess auf GitHub finden. Ein wichtiges Ergebnis, das mit Arbeitsprozessen erzielt werden kann, ist der (fast) Null -Ausfall -Server. Im Hauptprozess können Sie den Arbeitsprozess nacheinander enden und neu starten, nachdem Sie Änderungen an der Anwendung vorgenommen haben. Auf diese Weise können Sie die alte Version ausführen, während Sie die neue Version laden. Um Ihre Bewerbung zur Laufzeit neu zu starten, müssen Sie sich an zwei Dinge erinnern. Erstens wird der Hauptprozess ständig ausgeführt, und nur der Arbeitsprozess wird beendet und neu gestartet. Daher ist es wichtig, den Hauptprozess kurz zu halten und den Arbeitsprozess nur zu verwalten. Zweitens müssen Sie den Hauptprozess, den der Arbeitsprozess neu gestartet werden muss, irgendwie benachrichtigen. Es gibt verschiedene Möglichkeiten, dies zu tun, einschließlich der Änderungen der Benutzereingaben oder der Überwachung von Dateien. Letzteres ist effizienter, aber Sie müssen die Dateien identifizieren, um sie im Hauptprozess zu überwachen. Ich empfehle, den Arbeitsprozess neu zu starten, um sie zuerst sicher zu schließen. Sie können den ersteren ausführen, indem Sie eine Shutdown -Nachricht an den Arbeitsprozess senden, wie unten gezeigt: und starten Sie einen sicheren Abschaltungsabschluss im Worker Message Event -Handler: Um dies für alle Arbeiterprozesse zu tun, können Sie die Workers -Eigenschaft des Cluster -Moduls verwenden, das einen Verweis auf alle laufenden Arbeitsprozesse enthält. Wir können auch alle Aufgaben in einer Funktion im Hauptprozess einwickeln, die aufgerufen werden kann, wenn wir alle Arbeitsprozesse neu starten möchten. Wir können die IDs aller laufenden Arbeiterprozesse aus dem Arbeiterobjekt im Cluster -Modul erhalten. Dieses Objekt enthält einen Hinweis auf alle laufenden Arbeitsprozesse und Aktualisierungen, wenn die Arbeitsprozesse beendet und neu gestartet werden. Zunächst speichern wir die IDs aller laufenden Arbeiterprozesse im WorkerIDS -Array. Auf diese Weise vermeiden wir es, den neu abgeleiteten Arbeitsprozess neu zu starten. Wir bitten dann, dass jeder Arbeiterprozess sicher geschlossen wird. Wenn der Arbeitsprozess nach 5 Sekunden immer noch läuft und immer noch im Arbeiterobjekt existiert, nennen wir die Kill -Funktion im Arbeiterprozess, um sie zum Schließen zu zwingen. Sie können ein praktisches Beispiel auf GitHub finden. Schlussfolgerung node.js Anwendungen können mit dem Clustermodul parallelisiert werden, um eine effizientere Verwendung des Systems zu ermöglichen. Mehrere Prozesse können gleichzeitig mit mehreren Codezeilen ausgeführt werden, was die Migration relativ einfach macht, da Node.js schwierige Teile behandelt. Wie ich im Leistungsvergleich gezeigt habe, ist es möglich, eine erhebliche Verbesserung der Anwendungsleistung zu erzielen, indem die Systemressourcen effizienter eingesetzt werden. Zusätzlich zur Leistung können Sie die Anwendungszuverlässigkeit und die Betriebszeit verbessern, indem Sie Arbeitsprozesse während der Ausführung der Anwendung neu starten. Das heißt, Sie müssen vorsichtig sein, wenn Sie in Betracht ziehen, Clustermodule in Ihrer Anwendung zu verwenden. Die von Clustermodulen empfohlene Hauptnutzung ist für Webserver. In anderen Fällen müssen Sie sich genauer ansehen, wie Aufgaben zwischen Arbeitsprozessen zugewiesen werden und wie Fortschritte zwischen Arbeitsprozessen und Hauptprozessen effektiv kommuniziert werden können. Stellen Sie auch für Webserver sicher, dass ein einzelner Node.js -Prozess ein Engpass (Speicher oder CPU) ist, bevor Sie Änderungen an Ihrer Anwendung vornehmen, da Ihre Änderungen möglicherweise Fehler führen. Last but not least enthält die Website node.js eine gute Dokumentation für Clustermodule. Schauen Sie sich es also an! faqs über node.js cluster Der Hauptvorteil der Verwendung von Node.js Cluster besteht darin, die Leistung der Anwendung zu verbessern. Node.js läuft auf einem Thread, was bedeutet, dass es jeweils nur einen CPU -Kern verwenden kann. Moderne Server haben jedoch normalerweise mehrere Kerne. Durch die Verwendung des Cluster von node.js können Sie einen Hauptprozess erstellen, der mehrere Arbeitsprozesse abgeleitet hat, die jeweils auf einem anderen CPU -Kern ausgeführt werden. Auf diese Weise kann Ihre Anwendung gleichzeitig mehr Anfragen bearbeiten, was die Geschwindigkeit und Leistung erheblich verbessert. node.js cluster funktioniert, indem er einen Hauptprozess erstellt, der mehrere Arbeitsprozesse ableitet. Der Hauptprozess hört auf eingehende Anfragen zu und verteilt sie in Wahlweise an den Arbeitsprozess. Jeder Arbeiterprozess wird auf einem separaten CPU -Kern ausgeführt und behandelt die Anfragen unabhängig. Auf diese Weise kann Ihre Bewerbung alle verfügbaren CPU -Kerne nutzen und gleichzeitig mehr Anfragen bearbeiten. Erstellen eines node.js cluster beinhaltet die Verwendung des von node.js. Zunächst müssen Sie die Module "Cluster" und "Betriebssystem" importieren. Sie können dann die Methode "cluster.fork ()" verwenden, um den Arbeitsprozess zu erstellen. "os.cpus (). Länge" gibt Ihnen die Anzahl der verfügbaren CPU -Kerne, mit denen Sie die Anzahl der zu erstellenden Arbeitsprozesse ermitteln können. Hier ist ein einfaches Beispiel: Sie können den Arbeitsprozessabstürmen im Cluster von Node.js abwickeln, indem Sie nach "Beenden" -Ereignisse im Hauptprozess hören. Wenn der Arbeitsprozess abstürzt, sendet er ein "Exit" -Event an den Hauptprozess. Sie können dann die Methode "cluster.fork ()" verwenden, um einen neuen Worker -Prozess zu erstellen, um den abgestürzten Arbeitsprozess zu ersetzen. Hier ist ein Beispiel: Ja, Sie können den Cluster node.js mit Express.js verwenden. In der Tat kann die Verwendung von Node.js -Clustering die Leistung von Express.js -Anwendungen erheblich verbessern. Sie müssen nur den Anwendungscode express.js in den Worker -Prozesscode -Block in das Cluster -Skript einfügen. Während node.js cluster die Anwendungsleistung erheblich verbessern kann, hat es auch einige Einschränkungen. Beispielsweise teilen ein Arbeiterprozess keinen Zustand oder Speicher. Dies bedeutet, dass Sie keine Sitzungsdaten im Speicher speichern können, da sie in allen Arbeitsprozessen unzugänglich sind. Stattdessen müssen Sie einen gemeinsam genutzten Sitzungsspeicher wie eine Datenbank oder einen Redis -Server verwenden. standardmäßig verteilt der Hauptprozess im Node.js -Cluster eingehende Anforderungen an den Arbeitsprozess in einer Wahlweise. Dies bietet eine grundlegende Form des Lastausgleichs. Wenn Sie jedoch einen fortgeschritteneren Lastausgleich benötigen, müssen Sie möglicherweise einen Reverse -Proxy -Server wie Nginx verwenden. Ja, Sie können Node.js Cluster in der Produktionsumgebung verwenden. Tatsächlich wird dringend empfohlen, Node.JS -Cluster in Produktionsumgebungen zu verwenden, um den CPU -Kern des Servers optimal zu nutzen und die Leistung Ihrer Anwendung zu verbessern. debugging node.js cluster können etwas schwierig sein, da mehrere Arbeitsprozesse gleichzeitig ausgeführt werden. Sie können den Debugger jedoch jedem Prozess mit dem Flag "Überprüfung" mit einem einzigartigen Port für jeden Arbeitsprozess anschließen. Hier ist ein Beispiel: Ja, Sie können den Cluster node.js mit anderen Node.js -Modulen verwenden. Sie müssen jedoch beachten, dass der Arbeitsprozess keinen Zustand oder Speicher ausübt. Dies bedeutet, dass das Modul, wenn es vom gemeinsamen Zustand abhängt, in der Clusterumgebung möglicherweise nicht ordnungsgemäß funktioniert. node.js Cluster -Modul: Was macht es und wie es funktioniert
var cluster = require('cluster');
if(cluster.isMaster) { ... }
cluster.fork();
So verwenden Sie das Cluster -Modul in der node.js -Anwendung
var cluster = require('cluster');
var http = require('http');
var numCPUs = 4;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end('process ' + process.pid + ' says hello!');
}).listen(8000);
}
So entwickeln Sie einen hochskalierbaren Express -Server
var cluster = require('cluster');
Leistungsvergleich
并发连接
1
2
4
8
16
单进程
654
711
783
776
754
8个工作进程
594
1198
2110
3010
3024
Kommunikation zwischen dem Hauptprozess und dem Arbeiterprozess
var cluster = require('cluster');
if(cluster.isMaster) { ... }
cluster.fork();
var cluster = require('cluster');
var http = require('http');
var numCPUs = 4;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end('process ' + process.pid + ' says hello!');
}).listen(8000);
}
var cluster = require('cluster');
if(cluster.isMaster) {
var numWorkers = require('os').cpus().length;
console.log('Master cluster setting up ' + numWorkers + ' workers...');
for(var i = 0; i < numWorkers; i++) {
cluster.fork();
}
cluster.on('online', function(worker) {
console.log('Worker ' + worker.process.pid + ' is online');
});
cluster.on('exit', function(worker, code, signal) {
console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
cluster.fork();
});
} else {
var app = require('express')();
app.all('/*', function(req, res) {res.send('process ' + process.pid + ' says hello!').end();})
var server = app.listen(8000, function() {
console.log('Process ' + process.pid + ' is listening to all incoming requests');
});
}
Zero -Ausfallzeit
worker.on('message', function(message) {
console.log(message);
});
process.on('message', function(message) {
console.log(message);
});
var cluster = require('cluster');
Was sind die Hauptvorteile der Verwendung von Node.js -Clustern?
Wie funktioniert Node.js Cluster?
Wie erstellt man einen node.js cluster?
var cluster = require('cluster');
Wie kann ich mit dem Arbeitsprozessabstürze in Node.js Cluster umgehen?
if(cluster.isMaster) { ... }
Kann ich Node.js Cluster mit Express.js verwenden?
Was sind die Grenzen von Node.js -Clustern?
Wie lädt man Ausgleichsanforderungen in node.js cluster?
Kann ich Node.js Cluster in der Produktion verwenden?
Wie kann man Node.js Cluster debuggen?
cluster.fork();
Kann ich Node.js Cluster mit anderen Node.js -Modulen verwenden?
Das obige ist der detaillierte Inhalt vonSo erstellen Sie einen Node.js -Cluster, um Ihre Apps zu beschleunigen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!