Heim >Web-Frontend >js-Tutorial >Analysieren Sie die Verwendung des Node.js-Clustermoduls im Detail
Dieses Mal werde ich Ihnen eine Analyse des Node.js-Clustermoduls bringen. Was sind die Vorsichtsmaßnahmen für die detaillierte Erklärung der Verwendung des Node.js-Clustermoduls? Das Folgende ist ein praktischer Fall. Schauen wir uns das gemeinsam an.
Cluster-Modulübersicht
Knoteninstanzen sind Single-Threaded-Vorgänge. Bei der serverseitigen Programmierung werden normalerweise mehrere Knoteninstanzen erstellt, um Clientanfragen 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 zur Mehrfachverteilung 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 übergeordnete und untergeordnete Prozesse.
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 Sonderbehandlung)
worker进程:创建server实例。然后通过IPC通道,向master进程发送消息,让master进程也创建 server 实例,并在该端口上监听请求。当请求进来时,master进程将请求转发给worker进程的server实例。
归纳起来,就是:master进程监听特定端口,并将客户请求转发给worker进程。
如下图所示:
问题3:如何将请求分发到多个worker
每当worker进程创建server实例来监听请求,都会通过IPC通道,在master上进行注册。当客户端请求到达,master会负责将请求转发给对应的worker。
具体转发给哪个worker?这是由转发策略决定的。可以通过环境变量NODE_CLUSTER_SCHED_POLICY设置,也可以在cluster.setupMaster(options)时传入。
默认的转发策略是轮询(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);
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Das obige ist der detaillierte Inhalt vonAnalysieren Sie die Verwendung des Node.js-Clustermoduls im Detail. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!