it-swarm.com.de

Welches ist die richtige Node.js-Architektur?

Ich bin ein bisschen verwirrt über die Architektur von Node.js

Is this real one ?

enter image description here

Erstens ist richtig oder zweitens? Weil im zweiten Diagramm jeder Aufruf zuerst V8 und dann Node.js Bindings durchläuft, aber im ersten ist es umgekehrt. Könnt ihr bitte beim Verständnis helfen. Danke im Voraus.

29
Sagar

Zunächst einmal sind beide Grafiken korrekt, obwohl die erste etwas veraltet ist. Der ascynchronische Teil von Node.js bestand früher aus libev, libeio und libuv. Als libuv in den letzten Jahren jedoch Fortschritte machte, " [in] der node-v0.9.0-Version von libuv libev wurde entfernt ", so dass libuv sich um das gesamte asynchrone I von Node.js kümmerte/O-Prozesse (daher natürlich auch Event-Loop). Die moderne Version von Node.js Architektur würde also "libeio" und "libev" durch "libuv" ersetzen (wie im zweiten Bild).

Der Grund, warum sich die beiden Grafiken in ihrer Struktur unterscheiden, ist, dass sie in Bezug auf unterschiedliche Perspektiven organisiert sind. Grafik 1 zeigt die Klassifizierung der verschiedenen Teile der Node.js-Technologie von High-Level- zu Low-Level-Technologie (dies impliziert also keinen Workflow). Grafik 2 ist der tatsächliche Arbeitsablauf einer Node.js-Operation.

Um dies in eine Analogie zu fassen: Nehmen wir an, Sie versuchen, verschiedene Teile eines Autos mithilfe von Diagrammen darzustellen. Sie können dies auf verschiedene Arten tun: Sie können die verschiedenen Teile entweder nach ihren Klassifikationen/Funktionalitäten (Szenario A) ordnen, also:

  • Antriebssystem : Motor, Öl, Kühlung, Abgas usw.
  • Getriebesystem : Getriebe, Welle, Kupplung, Differential usw.
  • Aufhängungssystem : Querlenker, Stoßdämpfer, Lenkungsteile usw.
  • ......

oder Sie können die Teile auch nach Workflow organisieren (Szenario B):

  • öl -> Motor -> Getriebe -> Differential -> Federung -> etc.

(Ich weiß nicht viel über Autos. Der Name der Teile und der tatsächliche Arbeitsablauf sind möglicherweise falsch. Er wird nur aufgeführt, um das Verständnis zu erleichtern.)

Da die Art und Weise, in der Sie die Teile organisieren, unterschiedlich ist, ändert sich auch die Reihenfolge, in der sie angezeigt werden. Szenario A ähnelt Ihrem Diagramm 1, und Szenario B ähnelt Diagramm 2.


Ich bin mir nicht sicher, wie gut Sie die Funktionsweise von Node.js verstehen. Daher werde ich einen kurzen Überblick über die verschiedenen Elemente geben, die in die Architektur von Node.js passen, bevor wir fortfahren, um zu erläutern, wie sie miteinander interagieren:

  • V8 - Googles Open-Source-JavaScript-Engine, die sich in Chrome/Chromium-Browsern befindet. Anstatt JavaScript-Code im laufenden Betrieb zu interpretieren, wie dies bei typischen Webbrowsern der Fall ist, übersetzt V8 Ihren JS-Code in Maschinencode, sodass er blitzschnell ist. V8 ist in C++ geschrieben. Lesen Sie mehr darüber, wie V8 funktioniert hier .

  • libuv - libuv wurde ursprünglich entwickelt, um asynchrone E/A bereitzustellen, einschließlich asynchroner TCP & UDP-Sockets, (berühmte) Ereignisschleife, asynchrone DNS-Auflösung, Lese-/Schreibzugriff auf das Dateisystem usw. libuv ist in C geschrieben. Hier ist ein gutes Video , um mehr über libuv zu erfahren.

  • Andere Low-Level-Komponenten - wie c-ares , http-Parser , OpenSSL , zlib und etc, meistens in C/C++ geschrieben.

  • Anwendung - hier ist Ihr Code, Module und Node.js ' eingebaute Module , geschrieben in JavaScript (oder kompiliert für JS über TypeScript, CoffeeScript usw.)

  • Bindung - Eine Bindung ist im Grunde ein Wrapper um eine Bibliothek, die in einer Sprache geschrieben ist, und setzt die Bibliothek Codes aus, die in einer anderen Sprache geschrieben sind, so dass Codes in verschiedenen Sprachen geschrieben sind kann kommunizieren.

Jetzt sollte das erste Diagramm Sinn machen: Oben ist Ihre Anwendung (, Module und Kernmodule von Node.js) in JavaScript geschrieben. Unten sind die internen Komponenten von Node.j in C/C++ geschrieben. Um sie zu überbrücken, damit sie kommunizieren können, benötigen Sie Bindungen. Hier befinden sich also die Bindungen von Node.js: zwischen Anwendungen auf hoher Ebene und Komponenten auf niedriger Ebene. Node) Dieses Diagramm stellt nicht unbedingt den Workflow dar, sondern ist lediglich eine Klassifizierung der verschiedenen Node.js-Elemente zu ihren Beziehungen/Funktionalitäten zueinander.

Das zweite Diagramm zeigt den tatsächlichen Arbeitsablauf einer Node.js-Anwendung. Der in Ihrer Anwendung geschriebene Code wird von V8 kompiliert. Der Code kommuniziert über Bindungen mit Node.js-Komponenten auf niedriger Ebene. Alle in Ihrem Code geschriebenen Ereignisse werden bei Node.js registriert. Sobald Ereignisse ausgelöst wurden, werden sie in der Reihenfolge, in der sie ausgelöst wurden, in die Ereigniswarteschlange eingereiht. Solange sich noch Ereignisse in der Ereigniswarteschlange befinden, werden sie von der Ereignisschleife abgerufen, ihre Rückruffunktionen aufgerufen und zur Verarbeitung an Worker-Threads gesendet. Sobald eine Rückruffunktion ausgeführt wird, wird ihr Rückruf erneut an die Ereigniswarteschlange gesendet und wartet darauf, von der Ereignisschleife wieder aufgenommen zu werden.

Ein Teil Ihrer Verwirrung könnte durch die Wahl der im zweiten Diagramm verwendeten Fachbegriffe verursacht werden. Wenn Sie genau hinschauen, steht unter "NODE.JS BINDINGS" "(NODE API)", was leider zwei verschiedene Dinge sind. Node.js API ist die Schnittstelle der integrierten Bibliotheken, während Bindings aus Sicht der Softwareprogrammierung Brücken zwischen in verschiedenen Sprachen geschriebenen Codes sind.

Ich hoffe das hilft.


Eine genauere Darstellung der internen Struktur von Node.js ist: Node.js Architecture (Ich habe dieses Bild vor einiger Zeit von einer Quelle im Internet heruntergeladen und vergessen, woher es stammt. Wenn das Bild Ihnen gehört, kommentieren Sie es bitte und ich werde das Guthaben darunter hinzufügen! Danke!)


Bearbeiten: Ich habe kürzlich einen umfassenderen Artikel zum Erläutern von Node.js 'Architektur mit einer leicht verständlichen Analogie geschrieben. Ich wünschte, es könnte helfen!

64
Aren Li