


Eine kurze Diskussion über hohe Parallelität und verteiltes Clustering in node.js
Dieser Artikel stellt Ihnen eine kurze Diskussion über hohe Parallelität und verteilte Cluster in node.js vor. Ich hoffe, dass er für Sie hilfreich ist.
Knotenfunktionen: hohe Parallelität
Bevor Sie erklären, warum Knoten eine hohe Parallelität erreichen können, können Sie sich auch einige andere Funktionen von Knoten ansehen:
Single-Threaded
Lassen Sie uns zunächst ein Konzept klären, das heißt: Knoten ist 单线程
, was den Eigenschaften von JavaScript im Browser entspricht, und im Knoten unterscheidet sich der JavaScript-Hauptthread von anderen Threads (z. B. E/A-Threads) können den Status nicht teilen.
Der Vorteil eines einzelnen Threads ist:
Es besteht keine Notwendigkeit, auf das Statussynchronisationsproblem zwischen Threads wie Multithreading zu achten
Es entsteht kein Overhead durch Threadwechsel
Kein Deadlock existiert
Natürlich hat Single Threading auch viele Nachteile:
Multi-Core-CPU kann nicht vollständig ausgenutzt werden
Eine große Anzahl von Berechnungen, die die CPU belegen, führt zu Anwendungsblockaden (d. h. nicht geeignet für CPU- intensiv)
Fehler führen zum Beenden der gesamten Anwendung
Heute scheint es jedoch, dass diese Nachteile kein Problem mehr darstellen oder waren entsprechend gelöst:
(1) Prozess- oder Unterteilungsinstanz erstellen
Was das erste Problem betrifft, ist die einfachste Lösung die Verwendung des child_process-Kernmoduls oder -Clusters: child_process und net kombinierte Anwendung. Wir können jeden Kern voll ausnutzen, indem wir mehrere Prozesse auf einem Multi-Core-Server erstellen (normalerweise mithilfe einer Fork-Operation), müssen uns jedoch mit Kommunikationsproblemen zwischen Prozessen befassen.
Eine andere Lösung besteht darin, dass wir die physische Maschine in mehrere virtuelle Maschinen mit einem Kern aufteilen und Tools wie pm2 verwenden können, um mehrere virtuelle Maschinen zu verwalten, um eine Cluster-Architektur zu bilden, um die erforderlichen Dienste effizient auszuführen Ich werde hier nicht auf die Kommunikation (Statussynchronisierung) zwischen Maschinen eingehen, sondern sie im Folgenden in der verteilten Knotenarchitektur ausführlich erläutern.
(2) Zeitscheibenrotation
Was den zweiten Punkt betrifft, glaube ich nach Diskussion mit meinen Freunden, dass wir die Zeitscheibenrotation verwenden können, um Multithreading in einem einzelnen Thread zu simulieren und entsprechend zu reduzieren Anwendungsblockierung. Gefühl (obwohl diese Methode nicht wirklich Zeit spart wie Multithreading)
(3) Lastausgleich, Überwachung/Isolierung toter Pixel
Was den dritten Punkt betrifft, meine Freunde und I Wir haben auch besprochen, dass der Hauptproblempunkt darin besteht, dass sich der Knoten von JAVA unterscheidet und die von ihm implementierte Logik hauptsächlich asynchron ist.
Dies führt dazu, dass der Knoten Try/Catch nicht so bequem wie JAVA zum Abfangen und Umgehen von Fehlern verwenden kann, da nicht bestimmt werden kann, wann die asynchrone Aufgabe die Ausnahme zurückgibt. In einer Single-Thread-Umgebung bedeutet das Versäumnis, Fehler zu umgehen, dass die Anwendung beendet wird und die Lücke zwischen Neustart und Wiederherstellung zu Dienstunterbrechungen führt, die wir nicht sehen möchten.
Da die Serverressourcen jetzt reichlich vorhanden sind, können wir natürlich Tools wie pm2 oder nginx verwenden, um den Dienststatus dynamisch zu bestimmen. Isolieren Sie den fehlerhaften Pixelserver, wenn ein Dienstfehler auftritt, leiten Sie die Anforderung an den normalen Server weiter und starten Sie den fehlerhaften Pixelserver neu, um weiterhin Dienste bereitzustellen. Dies ist auch Teil der verteilten Architektur von Node.
Asynchrone E/A
Da es sich bei dem Knoten um einen Single-Thread handelt und alle Ereignisse in einem Thread verarbeitet werden, fragen Sie sich vielleicht, ob das nicht sehr ineffizient sein und einer hohen Parallelität widersprechen sollte?
Im Gegenteil, die Leistung des Knotens ist sehr hoch. Einer der Gründe dafür ist, dass der Knoten über die Funktion 异步I/O
verfügt. Immer wenn eine E/A-Anfrage auftritt, stellt der Knoten einen E/A-Thread für die Anfrage bereit. Dann kümmert sich der Knoten nicht um den E/A-Vorgangsprozess, sondern führt das Ereignis weiterhin im Hauptthread aus. Es muss nur verarbeitet werden, wenn die Anforderung den Rückruf zurückgibt. Das heißt, Node spart viel Zeit beim Warten auf Anfragen.
Dies ist auch einer der wichtigen Gründe, warum der Knoten eine hohe Parallelität unterstützt.
Tatsächlich sind nicht nur E/A-Vorgänge, sondern auch die meisten Vorgänge des Knotens asynchron. in einer Art und Weise durchgeführt. Es ist wie ein Organisator, der nicht alles persönlich erledigen muss. Er muss den Mitgliedern nur sagen, wie sie richtig vorgehen, Feedback annehmen und wichtige Schritte durchführen, damit das gesamte Team effizient arbeiten kann.
Transaktionsgesteuert
Vielleicht möchten Sie noch einmal fragen: Woher weiß der Knoten, dass die Anfrage einen Rückruf zurückgegeben hat, und wann sollte er diese Rückrufe verarbeiten?
Die Antwort ist eine weitere Funktion des Knotens: 事务驱动
, das heißt, der Hauptthread führt das Programm aus, indem er die Ereignisschleife auslöst
Dies ist eine weitere Möglichkeit, wie der Knoten eine hohe Parallelität unterstützt . Wichtige Gründe
Diagramm der Ereignisschleife in der Knotenumgebung:
┌───────────────────────┐ ┌─>│ timers │<p><strong>Umfragephase: </strong></p><p>Beim Eintritt in die Umfragephase und dort Es gibt keine Timer. Beim Aufruf geschieht Folgendes: </p><p> (1) Wenn die Umfragewarteschlange nicht leer ist: </p>
Ereignisschleife führt den Rückruf in der Umfragewarteschlange aus synchron (neues I/O-Ereignis), bis die Warteschlange leer ist oder der ausgeführte Callback online geht.
(2) Wenn die Umfragewarteschlange leer ist:
Wenn das Skript setImmediate() aufruft, beendet die Ereignisschleife die Umfragephase und geben Sie ein: Führen Sie den Rückruf von setImmediate() in der Prüfphase aus.
Wenn das Skript nicht von setImmediate() aufgerufen wird, wartet die Ereignisschleife darauf, dass Rückrufe (neue E/A-Ereignisse) zur Warteschlange hinzugefügt werden, und führt sie dann sofort aus.
Beim Eintritt in die Umfragephase und beim Aufrufen von Timern geschieht Folgendes:
Sobald die Umfragewarteschlange leer ist, prüft die Ereignisschleife, ob Timer, Wenn ein oder mehrere Timer angekommen sind, kehrt die Ereignisschleife zur Timer-Phase zurück und führt die Rückrufe dieser Timer aus (dh gibt den nächsten Tick ein).
Priorität:
Nächste Tick-Warteschlange > MicroTask-Warteschlange
setTimeout, setInterval > setImmediate
Da der Timer den Timer aus dem Rot-Schwarz-Baum herausnehmen muss, um zu bestimmen, ob die Zeit angekommen ist, beträgt die Zeitkomplexität O(lg(n)). Wenn Sie also ein Ereignis sofort asynchron ausführen möchten, ist es am besten, dies nicht zu tun setTimeout(func, 0) zu verwenden. Verwenden Sie stattdessen „process.nextTick()“, um dies zu tun.
Verteilte Knotenarchitektur
Die Knotenclusterarchitektur, die ich gelernt habe, ist hauptsächlich in die folgenden Module unterteilt:
Nginx (Lastausgleich, Planung) -> ;Knotencluster-> Redis (Synchronisationsstatus)
Ich habe ein Bild nach meinem Verständnis organisiert:
Dies sollte eine ideale Architektur sein. Denn obwohl das Lesen/Schreiben von Redis recht schnell ist, liegt dies daran, dass es Daten im Speicherpool speichert und entsprechende Vorgänge im Speicher ausführt.
Das ist ziemlich hoch für die Speicherauslastung des Servers, daher fügen wir normalerweise immer noch MySQL zur Architektur hinzu, wie unten gezeigt:
Erklären Sie zuerst dieses Bild:
Wenn Benutzerdaten eintreffen, werden die Daten zuerst in MySQL geschrieben. Wenn der Knoten die Daten benötigt, wird er an Redis gesendet, um sie zu lesen. Wenn sie nicht gefunden werden, werden sie an MySQL gesendet Um die gewünschten Daten abzufragen und zu schreiben, geben Sie Redis ein, und Sie können bei der nächsten Verwendung direkt in Redis abfragen.
Die Vorteile des Hinzufügens von MySQL im Vergleich zum reinen Lesen/Schreiben in Redis sind:
(1) Vermeiden Sie, kurzfristig nutzlose Daten in Redis zu schreiben, Speicher zu belegen und die Belastung von Redis zu verringern
(2) Wenn in der späteren Phase spezifische Abfragen und Datenanalysen erforderlich sind (z. B. die Analyse der Zunahme der Benutzer bei betrieblichen Aktivitäten), können relationale SQL-Abfragen eine große Hilfe sein
Natürlich Wenn der Datenverkehr in kurzer Zeit verarbeitet wird, können wir Daten auch direkt in Redis schreiben, um den Zweck zu erreichen, Daten schnell zu speichern und die Fähigkeit des Servers zu erhöhen, den Datenverkehr zu bewältigen Daten separat an MySQL übertragen.
Nachdem wir kurz die allgemeine Architekturzusammensetzung vorgestellt haben, werfen wir einen genaueren Blick auf die Details jedes Teils:
Verkehrszugriffsschicht
Was die Verkehrszugriffsschicht tut, ist Alles akzeptiert Der Verkehr wird verarbeitet und die folgenden Dienste werden bereitgestellt:
Verkehrspufferung
Umleitung und Weiterleitung
Timeout-Erkennung
-
Timeout beim Herstellen einer Verbindung mit dem Benutzer
Zeitüberschreitung beim Lesen des Benutzertexts
Zeitüberschreitung beim Herstellen einer Verbindung zum Backend
-
Zeitüberschreitung beim Lesen des Backend-Antwortheaders
Zeitüberschreitung beim Schreiben der Antwort
Lange Zeitüberschreitung bei der Verbindung mit dem Benutzer
Cluster-Zustandsprüfung/-Isolation Schlecht Pixelserver
Isolieren Sie den fehlerhaften Pixelserver und versuchen Sie, ihn zu reparieren/neu zu starten, bis der Server wieder normal ist
Fehler erneut Testmechanismus
Nachdem die Anfrage an eine bestimmte Maschine in einem bestimmten Cluster weitergeleitet wurde und ein Fehler zurückgegeben wurde, wird die Anfrage an andere Maschinen im Cluster weitergeleitet, oder an Maschinen über Cluster hinweg erneut versuchen
Verbindungspooling/Sitzungspersistenzmechanismus
Verwenden Sie den Verbindungspoolingmechanismus für verzögerungsempfindliche Benutzer um die Verbindungsaufbauzeit zu verkürzen
Sicherheitsschutz
Datenanalyse
Bei Weiterleitung zu jedem Produkt Nachdem Sie online gegangen sind, ist es Zeit, an der Lastschicht zu arbeiten: Leiten Sie die Anfrage je nach Situation an verschiedene Computerräume weiter
Natürlich , diese Plattform ist nicht auf die Weiterleitung beschränkt, Sie können sie als großes privates Cloud-System verstehen, das die folgenden Dienste bereitstellt:
Datei-Upload/Online-Bereitstellung von Diensten
Zeile Ändern Sie die Konfiguration
Geplante Aufgaben festlegen
Online-Systemüberwachung/Protokolldruckdienst
Online-Instanzverwaltung
Spiegelcenter
usw....
Knotenclusterschicht
Die Hauptaufgabe dieser Schicht ist:
(1) Schreiben Sie zuverlässigen Knotencode und stellen Sie Back-End-Dienste für den Bedarf bereit
(2) Schreiben Sie leistungsstarke Abfrageanweisungen, interagieren Sie mit Redis und MySQL und verbessern Sie die Abfrageeffizienz
(3) Synchronisieren Sie den Status jedes Knotendienstes im Cluster über Redis
(4) Übergeben Sie die Hardware-Verwaltungsplattform, verwalten/überwachen Sie den Status physischer Maschinen, verwalten Sie IP-Adressen usw. (Tatsächlich scheint es unangemessen, diesen Teil der Arbeit auf diese Ebene zu legen, aber ich weiß nicht, um welche Ebene es sich handelt sollte platziert werden auf...)
(Natürlich liste ich die Einträge in diesem Teil nur kurz auf, es braucht immer noch Zeit, sie zu sammeln und gründlich zu verstehen)
Datenbankschicht
Die Hauptarbeit dieser Ebene ist:
(1) MySQL erstellen und verwandte Seiten und Tabellen entwerfen; erforderliche Indizes und Fremdschlüssel einrichten, um den Abfragekomfort zu verbessern
(2) Redis bereitstellen und Bereitstellung entsprechender Schnittstellen zur Knotenschicht
Verwandte Empfehlungen:
Wie Vue Axios verwendet, um Backend-Daten anzufordern
Analyse der Formulareingabebindung und Komponentengrundlagen in Vue
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über hohe Parallelität und verteiltes Clustering in node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Da ich seit Kurzem für den Aufbau, die Stabilität, den Betrieb und die Wartung von Objektspeichersystemen verantwortlich bin, muss ich als Neuling im Bereich „Objektspeicher“ mein Wissen in diesem Bereich vertiefen. Da das Unternehmen derzeit MinIO zum Aufbau des Objektspeichersystems des Unternehmens verwendet, werde ich in Zukunft nach und nach meine Lernerfahrungen zu MinIO teilen. Jeder ist herzlich eingeladen, weiterhin darauf zu achten. In diesem Artikel wird hauptsächlich die Einrichtung von MinIO in einer Testumgebung vorgestellt. Dies ist auch der grundlegendste Schritt beim Aufbau einer MinIO-Lernumgebung. 1. Bereiten Sie die experimentelle Umgebung mit der virtuellen Maschine OracleVMVirtualBox vor, installieren Sie eine Mindestversion von Linux und fügen Sie dann 4 virtuelle Festplatten hinzu, die als virtuelle MinIO-Festplatten dienen. Die experimentelle Umgebung ist wie folgt: Als nächstes möchte ich sie Ihnen kurz vorstellen

So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Verwendung: In JavaScript wird die Methode insertBefore() verwendet, um einen neuen Knoten in den DOM-Baum einzufügen. Diese Methode erfordert zwei Parameter: den neuen Knoten, der eingefügt werden soll, und den Referenzknoten (d. h. den Knoten, an dem der neue Knoten eingefügt wird).
