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?
quelle
Antworten:
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.
quelle
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.
quelle
Die drei Hauptgründe, die ich nennen möchte, sind:
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.
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).
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.]
quelle