Was ist so einzigartig an Node.js? [geschlossen]

48

In letzter Zeit gab es viel Lob für Node.js. Ich bin kein Entwickler, der schon viel mit Netzwerkanwendungen zu tun hatte. Nach meinem bloßen Verständnis von Nodes.js ist seine Stärke: Wir haben nur einen Thread, der mehrere Verbindungen verarbeitet und eine ereignisbasierte Architektur bereitstellt.

In Java kann ich beispielsweise mit NIO / AIO (nach meinem Verständnis nicht blockierende APIs) nur einen Thread erstellen und mit diesem Thread mehrere Verbindungen verwalten. Außerdem stelle ich eine ereignisbasierte Architektur zur Implementierung der Daten bereit Handhabungslogik (sollte durch Rückruf etc. nicht so schwierig sein)?

Angesichts der Tatsache, dass JVM eine noch ausgereiftere VM als V8 ist (ich erwarte, dass es auch schneller läuft) und die ereignisbasierte Handhabungsarchitektur nicht schwer zu erstellen ist, bin ich mir nicht sicher, warum Node.js so viel Aufmerksamkeit auf sich zieht. Habe ich einige wichtige Punkte übersehen?

Adrian Shum
quelle
3
Ich frage mich, warum es herabgestuft wird ... Ich glaube, diese Frage ist eher eine Programmierdiskussion, also habe ich keinen Stapelüberlauf durchgeführt. Ich habe auch versucht, nach ähnlichen Themen zu suchen, aber ich habe nur Informationen über die Stärke von Nodes.js gefunden, aber mein Problem ist, dass ich nicht wirklich verstehe, warum die "Stärke" so einzigartig ist (was ich immer noch nicht finde)
Adrian Shum
6
Versuchen Sie, dieses Muster in Java zu implementieren. Das funktioniert natürlich. Aber eines werden Sie sehen: In Java wird es sehr, sehr ausführlich sein: Sie brauchen Tonnen von Rückrufen, was fast immer bedeutet, neue Klassen zu erstellen. Das mag nach einem kleinen Trottel klingen, aber in einem großen Programm kann es ziemlich schnell hässlich und unhandlich werden.
Joachim Sauer
6
Javascript-Callbacks sind ebenso anfällig für Unhandlichkeit - und solche Spaghetti sind in Java viel einfacher zu debuggen und umzugestalten als in Javascript IMO.
Funkybro
5
@AdrianShum: Es ist ein Slashdot-Effekt. Alles, was nicht zur Gruppen-Denkweise passt, wird herabgestuft - wie das Lob von Microsoft auf /.
gbjbaanb
3
Ich bin überrascht, niemanden zu sehen, der den Hype erwähnt.
Deadalnix

Antworten:

33

Obwohl dieses Konzept in der Tat in vielen Sprachen implementiert werden kann (und wie dodgy_coder bereits erwähnte, wurde es zumindest in Ruby und Python implementiert), ist es nicht ganz so trivial, wie Sie sagen .

Ja, Java verfügt über nicht blockierende IO-APIs. So können Sie Raw-Disk- / Netzwerk-E / A-Vorgänge blockierungsfrei ausführen. Doch jede API , die irgendwie Wraps oder Griffe IO muss auch in einer nicht blockierenden Art und Weise implementiert werden. Jeder XML-Parser, jeder Datenbanktreiber, jeder Dateiformatkonverter muss geschrieben werden, um nicht blockierende E / A-Vorgänge zu unterstützen. Wenn eine einzelne Bibliothek in diesem Muster blockiert, wird die Serverleistung auf steinzeitliche Werte reduziert.

Node.js hat diese Bibliotheksinfrastruktur, weil sie immer so konzipiert wurde: Jede Bibliothek, die populär werden möchte, muss eine asynchrone API bereitstellen, sonst wird sie nicht verwendet.

Joachim Sauer
quelle
18
Ja. Mit anderen Worten: Die wichtigste Stärke von Node.js ist die wichtigste Schwäche von ECMAScript: die unglaublich beschissene ECMAScript-Standardbibliothek. Da die Entwickler von Node.js ohnehin jedes einzelne Rad neu erfinden mussten, hatten sie die Möglichkeit, es auf die richtige Weise neu zu erfinden.
Jörg W Mittag
4
Soweit ich weiß, war ECMAScript immer als eingebettete Sprache konzipiert, sodass keinerlei APIs auf Betriebssystemebene erforderlich waren (selbst Netzwerk-E / A wurden größtenteils abstrahiert). Dieser Mangel war in der Tat ein Vorteil für Node.js.
Joachim Sauer
"Jede Bibliothek, die populär werden will, muss eine asynchrone API bereitstellen, sonst wird sie nicht verwendet." Ich denke, genau das ist es, wonach ich suche. Gibt es eine Ressource, die untersucht, wie asynchrone APIs in Node.js bereitgestellt werden, z. B. für XML-Parsing und DB-Zugriff?
Adrian Shum
1
@AdrianShum im Allgemeinen, suchen Sie nach ereignisgesteuerten Programmierbeispielen. Spezifische Implementierungen können in vielen Sprachen gefunden werden. Neben Node.js Modulen können Sie sich Twisted-Beispiele in Python, twistedmatrix.com/trac/wiki , POE-Beispiele in Perl, poe.perl.org und Ruby EventMachine, github.com/eventmachine/eventmachine
mghicks
19

Wahrscheinlich ist der Hauptgrund, dass JavaScript verwendet wird, um serverseitige Komponenten für Dinge wie Webserver, Webanwendungen oder Webservices zu schreiben. Dies vereinheitlicht die traditionelle Front-End-Entwicklungssprache (clientseitig) JavaScript mit der serverseitigen Sprache.

Sie haben Recht - die Tatsache, dass es nicht blockierend ist und das Reaktormuster nicht eindeutig verwendet wird - es wurde vor der Verwendung anderer Sprachen und Frameworks, wie z. B. Ruby's EventMachine oder Python's Twisted, durchgeführt.

dodgy_coder
quelle
5
Sehr wenige Technologien haben wirklich einzigartige Merkmale. Die Einzigartigkeit ergibt sich aus der besonderen Kombination all ihrer Merkmale
jk.
1
Einverstanden, es gibt hier eine Liste von Bibliotheken, die es in allen wichtigen Sprachen unterstützen ... Reactor Pattern auf Wikipedia
dodgy_coder
10

Die drei Hauptgründe, die ich nennen möchte, sind:

  1. Nicht blockierende E / A / Asynchrone E / A. Dies ist überall im Web und auf den vorherigen Postern zu finden. Eine Sache, die ich beitragen würde, ist, dass das Entwerfen Ihres Codes, um explizit asynchrones Verhalten anzunehmen, die Compiler-Engine dabei unterstützt, die Hardware zu maximieren. Ja, viele der JIT-Compiler und Hyperthreading-Prozessoren verwenden synchronen Code und helfen bei der Parallelisierung der Ausführung. Dies ist natürlich ein Best-Effort-Ansatz. Wenn Sie dagegen die Anwendung explizit für die asynchrone Verarbeitung erstellen, stellen Sie sicher, dass die Engine und die Hardware die Ausführungszeit für Ihren Code maximieren können. Zugegeben, ich habe keine quantifizierbaren Daten, um dies zu beweisen, aber es macht mich innerlich warm, so zu denken.

  2. Einzelne Codebasis für Client und Server. Dies hat eine Reihe von Vorteilen: Sie können zur Optimierung der Rechenzentrumskosten beitragen, indem Sie die Geschäftslogik vom Server auf den Client übertragen. Hilfe bei der Wiederverwendung von Geschäftslogik / Datenvalidierung; Reduzieren Sie die Komplexität der Entwicklerfähigkeiten, die für die Unterstützung des Produkts erforderlich sind (im Gegensatz zu Python und Javascript).

  3. Niedrige Eintrittsbarriere. In vielerlei Hinsicht ist Javascirpt wie Basic, Pascal und Perl des vergangenen Jahres. Das Schreiben von Code ist kinderleicht und erfordert nicht viel Fachwissen, um loszulegen. Dies hilft auch dabei, Ihre Entwicklungskosten zu senken, indem Sie mehr Junior-Entwickler einbeziehen und die Vorbereitungen für ein Projekt treffen können. [Natürlich muss man die Ideologen überwinden, die glauben, dass Programmiersprachen schwierig sein sollten, um die schlecht funktionierenden Entwickler auszumerzen.]

cflat
quelle
Ich bin mir nicht sicher, ob ich empfehlen würde, ein Node-Team ausschließlich mit jr aufzubauen. JS-Entwickler Architektur ist nicht wirklich etwas, worüber wir uns in jr-grade Web / UI-Projekten Gedanken machen müssen, und JS benötigt so viel Zeit, um beim Bauen auf lange Sicht richtig gut zu werden, wie jede andere Sprache, auch wenn Sie relativ gute Ergebnisse erzielen können Schnell mit geringerer Erfahrung bei weniger komplexen Projekten als üblich.
Erik Reppen
Ich bin einverstanden mit @ErikReppen; Ein Architekturteam, das sich ausschließlich aus Junior-Entwicklern zusammensetzt (unabhängig von der Sprache), ist wie das Entwerfen und Bauen eines Hauses unter Verwendung von Tischlern, die sich gut mit dem Bau von Stühlen, Tischen und Hundehütten auskennen.
Wildcard