Dieser Artikel stellt hauptsächlich die Einführung des Clustermoduls in Node.js vor. Es hat einen gewissen Referenzwert. Jetzt können Freunde in Not darauf verweisen.
Das Single-Thread-Design von Node Nicht mehr verfügbar. Um die Maschinenleistung vollständig zu „quetschen“, hat Node einen integrierten Modulcluster hinzugefügt, der Clusterfunktionen implementieren kann, indem er eine Reihe untergeordneter Prozesse über einen übergeordneten Prozess verwaltet Interessierte Freunde des Node.js-Clustermoduls können sich auf
Clustermodulübersicht
Knoteninstanzen sind Single-Thread-Operationen beziehen. Bei der serverseitigen Programmierung werden normalerweise mehrere Knoteninstanzen erstellt, um Clientanforderungen zu bearbeiten und so den Systemdurchsatz zu verbessern. Für solche Instanzen mit mehreren Knoten nennen wir es einen Cluster.
Mit dem Cluster-Modul von Node können Entwickler die Vorteile von Cluster-Diensten nutzen, ohne den ursprünglichen Projektcode zu ändern.
Der Cluster verfügt über die folgenden zwei gemeinsamen Implementierungslösungen, und das mit dem Knoten gelieferte Clustermodul übernimmt die zweite Lösung.
Option 1: Mehrere Knoteninstanzen + mehrere Ports
Die Knoteninstanzen im Cluster überwachen jeweils unterschiedliche Ports, und dann implementiert der Reverse-Proxy die Anforderung an mehrere Verteilungen von Häfen.
Vorteile: Einfache Implementierung, jede Instanz ist relativ unabhängig, was der Dienststabilität zugute kommt.
Nachteile: Erhöhte Hafenbelegung, Kommunikation zwischen Prozessen ist schwieriger.
Option 2: Der Hauptprozess leitet die Anfrage an den Kindprozess weiter
Erstellen Sie im Cluster einen Hauptprozess (Master) und mehrere untergeordnete Prozesse (Arbeiter). Der Master überwacht Client-Verbindungsanfragen und leitet sie gemäß bestimmten Richtlinien an Worker weiter.
Vorteile: Normalerweise ist nur ein Port belegt, die Kommunikation ist relativ einfach und die Weiterleitungsstrategie ist flexibler.
Nachteile: Die Implementierung ist relativ komplex und erfordert eine hohe Stabilität des Hauptprozesses.
Beispiel für den ersten Schritt
Im Clustermodul wird der Hauptprozess als Master und der untergeordnete Prozess als Master bezeichnet Arbeitnehmer.
Das Beispiel sieht wie folgt aus: Erstellen Sie eine Serverinstanz mit der gleichen Anzahl von CPUs, um Clientanfragen zu verarbeiten. Beachten Sie, dass sie alle denselben Port überwachen.
// server.js var cluster = require('cluster'); var cpuNums = require('os').cpus().length; var http = require('http'); if(cluster.isMaster){ for(var i = 0; i < cpuNums; i++){ cluster.fork(); } }else{ http.createServer(function(req, res){ res.end(`response from worker ${process.pid}`); }).listen(3000); console.log(`Worker ${process.pid} started`); }
Batch-Skript erstellen: ./req.sh.
#!/bin/bash # req.sh for((i=1;i<=4;i++)); do curl http://127.0.0.1:3000 echo "" done
Die Ausgabe ist wie folgt. Wie Sie sehen, stammen die Antworten aus unterschiedlichen Prozessen.
Antwort vom Arbeiter 23735
Antwort vom Arbeiter 23731
Antwort vom Arbeiter 23729
Antwort vom Arbeiter 23730
Cluster Modulimplementierungsprinzip
Um das Clustermodul zu verstehen, müssen wir hauptsächlich drei Fragen verstehen:
Wie kommunizieren Meister und Arbeiter?
Wie erreicht man die Portfreigabe für mehrere Serverinstanzen?
Mehrere Serverinstanzen, wie verteilt man Anfragen von Clients an mehrere Mitarbeiter?
Das Folgende wird anhand des schematischen Diagramms vorgestellt. Eine Einführung auf Quellcodeebene finden Sie im Github des Autors.
Frage 1: Wie Meister und Arbeiter kommunizieren
Diese Frage ist relativ einfach. Der Master-Prozess erstellt Worker-Prozesse über Cluster.fork(). Cluster.fork() erstellt intern untergeordnete Prozesse über child_process.fork().
Mit anderen Worten:
Der Master-Prozess und der Worker-Prozess sind die Beziehung zwischen übergeordneten und untergeordneten Prozessen.
Der Masterprozess und der Workerprozess können über den IPC-Kanal kommunizieren. (Wichtig)
Frage 2: So implementieren Sie die Portfreigabe
Im vorherigen Beispiel hörten Server, die in mehreren Wokern erstellt wurden, auf denselben Port . Port 3000. Wenn mehrere Prozesse denselben Port abhören, meldet das System im Allgemeinen einen Fehler.
Warum ist unser Beispiel in Ordnung?
Das Geheimnis besteht darin, dass die Methode listen() speziell im Netzmodul verarbeitet wird. Abhängig davon, ob der aktuelle Prozess ein Master-Prozess oder ein Worker-Prozess ist:
Master-Prozess: Anfragen normal auf diesem Port abhören. (Keine spezielle Verarbeitung)
Arbeitsprozess: Erstellen Sie eine Serverinstanz. Senden Sie dann über den IPC-Kanal eine Nachricht an den Master-Prozess, sodass der Master-Prozess auch eine Serverinstanz erstellt und auf diesem Port auf Anfragen wartet. Wenn eine Anfrage eingeht, leitet der Masterprozess die Anfrage an die Serverinstanz des Arbeitsprozesses weiter.
Zusammenfassend lässt sich sagen, dass der Master-Prozess einen bestimmten Port abhört und Kundenanfragen an den Worker-Prozess weiterleitet.
Wie unten gezeigt:
Frage 3: So verteilen Sie Anfragen an mehrere Mitarbeiter
Jedes Mal, wenn die Der Worker-Prozess erstellt eine Serverinstanz, die auf Anfragen wartet. Diese wird über den IPC-Kanal beim Master registriert. Wenn eine Client-Anfrage eintrifft, ist der Master dafür verantwortlich, die Anfrage an den entsprechenden Mitarbeiter weiterzuleiten.
An welchen Arbeitnehmer wird es konkret weitergeleitet? Dies wird durch die Weiterleitungsstrategie bestimmt. Es kann über die Umgebungsvariable NODE_CLUSTER_SCHED_POLICY festgelegt oder bei „cluster.setupMaster(options)“ übergeben werden.
默认的转发策略是轮询(SCHED_RR)。
当有客户请求到达,master会轮询一遍worker列表,找到第一个空闲的worker,然后将该请求转发给该worker。
master、worker内部通信小技巧
在开发过程中,我们会通过 process.on('message', fn) 来实现进程间通信。
前面提到,master进程、worker进程在server实例的创建过程中,也是通过IPC通道进行通信的。那会不会对我们的开发造成干扰呢?比如,收到一堆其实并不需要关心的消息?
答案肯定是不会?那么是怎么做到的呢?
当发送的消息包含cmd字段,且改字段以NODE_作为前缀,则该消息会被视为内部保留的消息,不会通过message事件抛出,但可以通过监听'internalMessage'捕获。
以worker进程通知master进程创建server实例为例子。worker伪代码如下:
// woker进程 const message = { cmd: 'NODE_CLUSTER', act: 'queryServer' }; process.send(message);
master伪代码如下:
worker.process.on('internalMessage', fn);
相关链接
官方文档:https://nodejs.org/api/cluster.html
Node学习笔记:https://github.com/chyingp/nodejs-learning-guide
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Das obige ist der detaillierte Inhalt vonEinführung in das Clustermodul in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!