2016-04-21 6 views
18

Ich bin etwas verwirrt über die Architektur von Node.jsWelche ist die richtige Node.js Architektur?

Is this real one ?

enter image description here

erste ist richtig oder zweite? Weil im zweiten Diagramm jeder Aufruf zuerst V8 und dann Node.js Bindings durchläuft, aber im ersten ist es umgekehrt. Kannst du bitte beim Verständnis helfen? Danke im Voraus.

+1

Beide sind richtig. Beachten Sie, dass der erste die JS-Anwendung nicht enthält, sondern nur die Layer, aus denen der Knoten erstellt wurde. – Bergi

+0

@bergi In der ersten ist v8 auf der gleichen Ebene wo libuv ist und in der zweiten v8 wird zuerst verarbeitet und dann Daten durch nodejs Bindings, die falsch scheint – Sagar

+0

Die Knoten Bindungen verlassen sich sowohl auf V8 und libuv, ich sehe nicht, was los ist damit. Natürlich sind die Abhängigkeiten in Wirklichkeit nicht so einfach, deshalb müssen beide Diagramme Abstraktion machen. Sicher, das zweite Diagramm ist ein bisschen komisch, genauso wie die "Anwendung" von V8 ausgeführt wird und nicht als Standalone daneben läuft, aber wie würdest du das zeichnen? – Bergi

Antwort

44

Zunächst sind beide Graphen korrekt, obwohl die erste etwas veraltet ist. Der asynchrone Teil von Node.js bestand aus libev, libeio und libuv. Im Laufe der letzten Jahre hat sich libuv jedoch weiterentwickelt: "[in] the node-v0.9.0 version of libuv libev was removed", was libuv dazu veranlasste, sich um die gesamten asynchronen I/O-Prozesse von Node.js zu kümmern (also natürlich auch über die Ereignisschleife). Die moderne Version der Node.js Architektur würde also die "libeio" und "libev" durch "libuv" ersetzen (wie im zweiten Bild).

Der Grund, warum die beiden Graphen sich in der Struktur unterscheiden, ist, dass sie in Bezug auf verschiedene Perspektiven organisiert sind. Diagramm 1 stellt die Klassifizierung von verschiedenen Teilen der Node.js-Technologie von High-Level zu Low-Level dar (somit ist kein Workflow gemeint); wohingegen Graph 2 der tatsächliche Arbeitsablauf einer Node.js-Operation ist.

Um dies in eine Analogie zu setzen: Nehmen wir an, Sie versuchen, verschiedene Teile eines Autos mit Graphen darzustellen. Sie können in vielen Möglichkeiten, dies zu tun: Sie können entweder die verschiedene Stücke durch ihre Einstufungen/Funktionalitäten (Szenario A) organisieren, also:

  • Energiesystem: Motor, Öl, Kühlung, Auspuff usw.
  • Übertragungssystem: Getriebe, Welle, Kupplungsanordnung, Differential usw.
  • Aufhängungssystem: Lenkerarm, Stoßdämpfer, Lenkungskomponenten usw.
  • ......

oder Sie können auch die Stücke vom Workflow (Szenario B) organisieren:

  • Öl -> Motor -> Getriebe -> Differential -> Federung -> usw.

(Ich weiß nicht im Detail über Autos. Der Name der Teile und der tatsächliche Workflow könnten falsch sein. Es ist nur aufgeführt, um mit dem Verständnis zu helfen.)

Jetzt, weil die Mittel, mit denen Sie die Stücke organisieren, unterschiedlich sind, unterscheiden sich auch die Reihenfolge, die sie erscheinen. Szenario A ist ähnlich zu Ihrem Diagramm 1 und Szenario B ähnelt grafisch darstellen 2.


Ich bin nicht sicher, wie viel verstehen Sie die Art und Weise Node.js funktioniert so werde ich einen kurzen Überblick über die zur Verfügung stellen verschiedene Stücke, die in Node passen.js Architektur, bevor sie zu der Art, wie sie miteinander interagieren zu erklären:

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

  • libuv - libuv ist ursprünglich asynchrone I/O liefern entwickelt, die & UDP-Sockets asynchrone TCP enthält, (bekannt) Ereignisschleife, asynchrone DNS-Auflösung, Dateisystem lesen/schreiben, und etc. libuv geschrieben in C. Hier ist eine gute video zu überprüfen, um mehr über libuv zu erfahren.

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

  • Anwendung - hier ist der Code, Module und Node.js' built in modules, in JavaScript geschrieben (oder kompiliert JS durch Typoskript, Coffeescript, etc.)

  • Bindung - eine Bindung Im Grunde ist es ein Wrapper um eine Bibliothek, die in einer Sprache geschrieben ist und die Bibliothek in einer anderen Sprache geschriebenen Codes verfügbar macht, so dass in verschiedenen Sprachen geschriebene Codes kommunizieren können.

Nun ist die erste Diagramm sollte Sinn machen: auf die Top-Anwendung ist (, Module und Kern node.js Einbaumodule) in JavaScript geschrieben; Auf der Unterseite sind Node.js interne Komponenten in C/C++ geschrieben. Um sie zu überbrücken, damit sie kommunizieren können, benötigen Sie Bindungen. Das ist der Punkt, an dem sich Node.js-Bindungen befinden: zwischen High-Level-Anwendungen und Low-Level-Node-Komponenten. Diese Grafiken stellen nicht unbedingt einen Workflow dar; es ist nur eine Klassifizierung von verschiedenen Node.js Stücken nach ihren Beziehungen/Funktionalitäten zueinander.

Das zweite Diagramm stellt den tatsächlichen Arbeitsablauf einer Node.js-Anwendung dar. In Ihrer Anwendung geschriebener Code wird von V8 kompiliert. Der Code kommuniziert mit Low-Level-Node.js-Komponenten über Bindungen. Alle in Ihrem Code geschriebenen Ereignisse sind bei Node.js registriert. Sobald Ereignisse ausgelöst werden, werden sie in der Ereigniswarteschlange in der Reihenfolge in die Warteschlange eingereiht, in der sie ausgelöst wurden. Solange noch weitere Ereignisse in der Ereigniswarteschlange vorhanden sind, werden sie von der Ereignisschleife weiterhin abgerufen, ihre Rückruffunktionen aufgerufen und zur Verarbeitung an Worker-Threads gesendet. Sobald eine Callback-Funktion ausgeführt wird, wird ihr Callback erneut an die Ereigniswarteschlange gesendet und wartet darauf, von der Ereignisschleife erneut aufgenommen zu werden.

Ein Teil Ihrer Verwirrung könnte von der Wahl der technischen Begriffe in der zweiten Grafik stammen. Wenn Sie genau hinsehen, sagt "NODE.JS BINDINGS" "(NODE API)", was leider zwei verschiedene Dinge sind. Node.js API ist die Schnittstelle seiner eingebauten Bibliotheken, während bindings, aus der Perspektive der Softwareprogrammierung, Brücken zwischen Codes sind, die in verschiedenen Sprachen geschrieben sind.

Ich hoffe, das hilft.


Eine genauere Darstellung von Node.js 'interne Struktur ist dies: Node.js Architecture (Ich habe dieses Bild von einer Quelle im Internet vor einer Weile zurück und ich habe vergessen, wo es herkommt. Wenn das Bild zu dir gehört, bitte Kommentar und ich werde Kredit unter! Danke!)


Edit: ich habe zu erklären Node.js's architecture mit einer einfach zu verstehende Analogie einen umfassenderen Artikel vor kurzem geschrieben. Ich wünschte, es könnte helfen!