suchen
HeimWeb-Frontendjs-TutorialEine 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:

Eine kurze Diskussion über hohe Parallelität und verteiltes Clustering in node.js

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:

Eine kurze Diskussion über hohe Parallelität und verteiltes Clustering in node.js

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

Eine kurze Diskussion über hohe Parallelität und verteiltes Clustering in node.js

  • 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

Eine kurze Diskussion über hohe Parallelität und verteiltes Clustering in node.js

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!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Linux中如何构建4块虚拟盘来搭建分布式MinIO集群?Linux中如何构建4块虚拟盘来搭建分布式MinIO集群?Feb 10, 2024 pm 04:48 PM

由于最近刚开始负责对象存储相关系统的建设与稳定性运维,作为一个“对象存储”的一个新手,需要加强这块的学习。由于公司目前采用MinIO来搭建公司的对象存储体系,后续我会逐步将自己关于MinIO的学习经验分享出来,欢迎大家持续关注。本文主要是介绍如何在测试环境中搭建MinIO,这也是构建MinIO学习环境最基本的步骤。1、准备实验环境使用OracleVMVirtualBox虚拟机,安装一个最小版本的Linux,然后添加4块虚拟盘,用于充当MinIO的虚拟盘。实验环境如下所示:接下来和大家简单介绍一下

Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

手把手带你使用Node.js和adb开发一个手机备份小工具手把手带你使用Node.js和adb开发一个手机备份小工具Apr 14, 2022 pm 09:06 PM

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

使用Gin框架实现分布式部署和管理功能使用Gin框架实现分布式部署和管理功能Jun 22, 2023 pm 11:39 PM

随着互联网的发展和应用,分布式系统也越来越受到人们的关注和重视。而在分布式系统中,如何实现快速部署和便捷管理则成为了一项必要的技术。本文将介绍如何使用Gin框架来实现分布式系统的部署和管理功能。一、分布式系统部署分布式系统的部署主要包括了代码部署、环境部署、配置管理和服务注册等几个方面。以下将逐一介绍这些方面。代码部署在分布式系统中,代码部署是一个重要的环节

详解node中如何安装多版本并进行切换详解node中如何安装多版本并进行切换May 27, 2022 pm 08:33 PM

本篇文章给大家深入了解一下多版本node的安装方法,并详细介绍一下node版本切换方法,希望对大家有所帮助!

聊聊Node.js path模块中的常用工具函数聊聊Node.js path模块中的常用工具函数Jun 08, 2022 pm 05:37 PM

本篇文章带大家聊聊Node.js中的path模块,介绍一下path的常见使用场景、执行机制,以及常用工具函数,希望对大家有所帮助!

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),