Node.js oder Java: Leistung, Ressourcen, Flusskontrolle, Popularität und persönliche Erfahrung

Meine Kollegen und ich haben kürzlich die Popularität einiger Technologien diskutiert - insbesondere Java und node.js. Nach einem kurzen Surfen im Internet stellte sich heraus, dass viele Informationsgiganten diese Technologien verwenden, um ihre Websites im Netzwerk zu entwickeln und zu pflegen. Im Folgenden werde ich nur einen kleinen Teil geben.

Unternehmen, die Java verwenden:

Bild

Unternehmen, die node.js verwenden:

Bild

Weniger interessant ist auch, dass laut einer Suche auf Indeed.com ( 28.06.2019 ) auf Anfrage von Java Developer (30272 Stellenangebote) und node.js Developer (7401 Stellenangebote) Spezialisten für diese Technologien sehr gefragt sind.

Bild

Dies alles sind jedoch nur allgemeine Informationen zur Popularität. Die Informationen, die mich dazu veranlassten, mich eingehender mit dem Thema zu befassen und über technische Merkmale zu spekulieren, führten zum Schreiben dieses Artikels.

Warum sind sie einen Vergleich wert?


Java ist eine Sprache, node.js kann als ein Ökosystem bezeichnet werden, das auf JS basiert und vor allem auf V8 basiert - einer Engine von Google.

Wenn wir jedoch über Java sprechen, sprechen wir nicht nur über die Sprache, sondern auch über die virtuelle Java-Maschine sowie das gesamte Ökosystem und die Infrastruktur, die um diese Maschine herum aufgebaut sind. Zumindest können sie auf dieser Basis verglichen werden - daher haben wir in beiden Fällen eine Laufzeit . Bei Java handelt es sich um eine virtuelle Maschine. Bei node.js handelt es sich um eine V8-Engine, die auf den meisten Betriebssystemen wie Windows, Linux, MacOS und weniger bekannten Betriebssystemen verfügbar ist.

Entwickler können Code in derselben Sprache schreiben. Dies funktioniert auf verschiedenen Betriebssystemen aufgrund der Laufzeit mehr oder weniger auf dieselbe Weise. Die Laufzeitumgebung beeinflusst, wie die Interaktion mit dem Betriebssystem erfolgt. Außerdem können sie seitdem verglichen werden Sie werden verwendet, um eine ähnliche Reihe von Problemen zu lösen .

V8 und JVM


Wenn der JS-Code in Version 8 eingeht, wird der JS-Code immer schneller ausgeführt, wenn die Kompilierung in Byte-Code, der in der virtuellen Maschine verwendet wird, gerade rechtzeitig durchgeführt wird.
Bytecode ist eine Zwischensprache auf hoher Ebene. In einer virtuellen Java-Maschine schreiben sie also nicht nur in Java, sondern auch in Scala und Kotlin.

Es gibt Voraussetzungen, dass in naher Zukunft für V8 nicht nur JS, sondern auch TypeScript oder andere verwendet werden können. Im Moment gibt es eine Umstellung dieser Sprachen in JS. In Zukunft werden sie wahrscheinlich sofort unterstützt, und alles wird viel schneller funktionieren.

Jetzt gibt es eine kontinuierliche Weiterentwicklung von V8, und im Großen und Ganzen ist das Erscheinen neuer Versionen von node.js mit dem Aufkommen einer neuen Version der V8-Engine verbunden. Sie sind direkt miteinander verbunden.

Node.js: Vor- und Nachteile


Node.js wurde 2009 von Ryan Dahl erstellt.

Node.js selbst enthält mehrere Hauptkomponenten:

  • V8 Motor
  • libuv-Bibliothek, die für den zentralen Teil des Knotens verantwortlich ist - eine Ereignisschleife, die mit dem Betriebssystem interagiert, sowie für die asynchrone Eingabe / Ausgabe (E / A);
  • aus einer Reihe verschiedener JS-Bibliotheken und direkt der JS-Sprache selbst.

Kommen wir zu den Vor- und Nachteilen.

Vorteile:

  • Leichtigkeit und Geschwindigkeit des Schreibens
  • Leichtigkeit
  • relative Einfachheit (im Vergleich zu Java)
  • npm (Node Package Manager (eine große Anzahl von Bibliotheken, die in einer Zeile installiert werden können)
  • Jede Bibliothek fällt in den Abhängigkeitsbaum und dies alles ist einfach zu bewerkstelligen
  • kontinuierliche Entwicklung (TypeScript wird aktiv weiterentwickelt (das Typing, Decorators zu JS bringt und beispielsweise für Angular verwendet wird)

Nachteile:

  • Flexibilität und schnelle Entwicklung erzeugen auch Nachteile wie Sie müssen Updates ständig überwachen. Einige Dinge werden nicht ausreichend getestet.
  • Es gab einen Fall, in dem ein Entwickler seine Bibliothek aus NPM entfernte und viele Anwendungen, die sie verwendeten, nicht mehr funktionierten.

Vor- und Nachteile von Java


Berücksichtigen Sie im Gegensatz dazu sofort die Hauptfunktionen von Java.

Vorteile:

  • Arbeitsgeschwindigkeit
  • Prävalenz (an Universitäten vieler Länder studieren sie Java, es ist auch bequem, OOP in Java zu studieren),
  • riesige Menge an Bibliotheken.

Nachteile:

  • Schwere
  • Einige Java-Paradigmen wurden schon lange erstellt und sind bereits veraltet.
  • JDK ist proprietär, daher entwickelt sich Java nur langsam.

Vor kurzem hat JS begonnen, Java zu überholen (und je weiter, desto mehr).
Java verlässt auch die Android-Welt und wird durch Kotlin ersetzt, das zwar die JVM verwendet, aber immer noch eine andere Sprache ist.

Oracle und Google Konflikt


Bild

Java wurde von Sun erstellt, das später von Oracle übernommen wurde und sich noch im Besitz von Sun befindet. Aus diesem Grund verursacht die Verwendung von Java für viele Unternehmen einige Probleme.

Google hatte Probleme, als Oracle mit ihnen eine Klage wegen der Verwendung von Java in Android einleitete. Aus diesem Grund hat Google Kotlin sehr aktiv übernommen, das unabhängig erschien. Java ist proprietär. Es gibt jedoch eine virtuelle Oracle-Maschine sowie eine offene virtuelle Java-Maschine (Open JVM), die unter Linux verwendet und in Open Source geschrieben wird. Manchmal gibt es einige Inkompatibilitäten, aber in letzter Zeit sind sie immer weniger.

Übrigens konnte Google Java nicht vollständig aufgeben. In Dalvik, das als Kern in Android verwendet wird, ist die JVM eingebettet. Vielleicht werden sie das verlassen, aber es wird sehr schwierig sein, dies zu tun, weil Fast das gesamte Android-Ökosystem basiert auf Java - hauptsächlich auf der Verwendung einer modernisierten JVM. Und das war irgendwann auch der Grund für den Konflikt zwischen Oracle und Google, weil Oracle es verbietet, nur die JVM zu aktualisieren. Dies ist der wichtigste Teil von Java. Und die Sprache selbst kann fast ohne Einschränkungen verwendet werden.

Java vs node.js: Leistung und Ressourcenverbrauch


Zunächst ist anzumerken, dass die Java-Leistung viel höher ist als die von JS und dementsprechend auch von node.js.

Bild
Node.js und Java-Leistung

Wenn Sie eine einfache Aufgabe ausführen, z. B. das Quadrieren, können die Indikatoren in Tests bis zu zehnmal variieren. Wenn Sie Schleifen in Millionen von Berechnungsaufgaben ausführen, übertrifft Java fast immer node.js. Außerdem besteht der große Unterschied zwischen Java und node.js darin, dass der Knoten Single-Threaded ist, was andererseits sowohl ein Vorteil als auch ein Nachteil ist.

Java kann mit Streams arbeiten, die auf Betriebssystemebene unterstützt werden, und es stellt sich heraus, dass ein in Java geschriebenes Programm die Funktionen des Betriebssystems optimal nutzt. Und wenn Sie eine hoch geladene Anwendung schreiben müssen, die eine große Anzahl von Berechnungen verwendet, ist Java definitiv besser dafür geeignet. Das Problem ist, dass selbst ein kleiner, in Java geschriebener Server viel Speicherplatz beansprucht - sowohl auf der Festplatte als auch online.

Node.js ist aufgrund seiner ereignisgesteuerten Architektur leichtgewichtig. Es wurde als Webserver entwickelt und leistet sehr gute Arbeit bei leichten Aufgaben. Eine einfache Abfrage wie das Berechnen von Daten oder das Schreiben in eine Datenbank erfolgt beispielsweise sehr schnell. Und wenn es viele Anfragen gibt und wir das System im Knoten skalieren möchten, können Sie den Nginx- oder Apache-Webserver verwenden. Sie können viele identische Knoteninstanzen haben. Dann wird alles durch Round-Robin-Lastausgleich verteilt. Wenn wir 8 Knoteninstanzen auf 16 Kernen ausführen, verteilt das Betriebssystem selbst die Instanzen auf die Kernel. Der Knoten kontrolliert dies nicht, er hat einen Thread.

Flusskontrolle in Java und node.js.


In Java können wir eine Anwendung erstellen und 8 Threads darin ausführen. Aufgrund der engeren Interaktion mit dem Betriebssystem können Sie die Last verteilen.

Wie Sie wissen, ist Tomcat einer der in Java geschriebenen Webserver. Dort können Sie deutlich sehen, dass zusätzliche Threads gestartet werden, wenn der Benutzer eine Anfrage stellt. Und wenn die Anfrage an den Knoten kommt, wird die Ereignisschleife verarbeitet und zurückgesendet, dann kommt die nächste Anfrage. Und aufgrund der Tatsache, dass wir die Ergebnisse des ersten nicht erwarten, wird es auch aufgegriffen. Während die Anfragen leicht sind, ist alles in Ordnung. Wenn jedoch eine umfangreiche Berechnung durchgeführt wird und eine Instanz vorhanden ist, stoppt der Knoten und es tritt eine Zeitüberschreitung auf.

Bild
Java-Thread-Verwaltung

Auf dem Knoten können Sie nur wenige Codezeilen schreiben und den einfachsten Webserver erhalten. Natürlich für eine breitere Funktionalität, wo es Benachrichtigungen, Autorisierungen, Protokollierung usw. geben wird. Die Implementierung ist schwieriger, aber es gibt Frameworks, mit denen Sie solche Probleme lösen können.

Bild
Flusskontrolle in node.js

Java hat eine entwickelte API - Concurrency API, mit der Sie mit wettbewerbsfähigen Threads arbeiten können. Gleichzeitig ist dies jedoch eines der Probleme seitdem Wettbewerbsfähigkeit ist eine sehr komplizierte Sache, und nicht jeder Entwickler kennt sich damit aus.

Das Web, die REST-API, ist das Element des Knotens und wird manchmal verwendet. Wenn es sich jedoch um komplexe Berechnungen handelt, ist es immer noch besser, Java zu verwenden.

Mein Java-Projekt


In Java hatte ich ein interessantes Projekt - eine verteilte Anwendung, deren Hauptaufgabe darin bestand, große Mengen grafischer Informationen zur weiteren Verwendung in Verzeichnissen zu verarbeiten. Beim Erstellen eines Katalogs müssen Sie Sätze einer großen Anzahl von Bildern mit verschiedenen Auflösungen vorbereiten, die zum Erstellen des Katalogs verwendet werden. Einfach ausgedrückt ist dies eine Anwendung zur Automatisierung der Katalogvorbereitung in der Druckvorstufe.

Früher mussten Fotografen alles manuell machen. Zuerst mussten Sie eine kleine Anwendung verwenden, um Ihre Bilder hochzuladen. Außerdem musste der Spezialist, der das Verzeichnis erstellt, die Verzeichnisstruktur über eine andere Anwendung entwickeln. Anschließend wurde in einer anderen Anwendung ein Workflow erstellt, der Bilder in die erstellte Struktur warf. Im Allgemeinen war der Prozess ziemlich schwierig. Verwendet ImageMagick unter Linux, Windows, MacOS. Wir hatten es mit Linux zu tun.

Zum Beispiel wurde ein .tiff-Bild mit einer Größe von 200 bis 300 MB in die Anwendung geladen, und daraus mussten Bilder mit verschiedenen Auflösungen erstellt, etwas geschnitten oder ein Substrat erstellt werden.
Die erste Version der Anwendung konnte die hohe Auslastung nicht bewältigen, selbst ein Server mit 16 Kernprozessoren fehlte. Wir haben die Anwendungsarchitektur für die gleichzeitige Verwendung mehrerer Instanzen verbessert, um die Anwendung nicht grundlegend zu ändern. Es wurden viele Instanzen gestartet, die miteinander interagierten, und jede von ihnen verarbeitete einen Teil der Aufgabe. Es war schwierig, aber wir konnten alles in nur wenigen Monaten erfolgreich umsetzen. Und das System funktioniert immer noch. Dabei mussten wir uns mit dem Wettbewerb und verschiedenen Aspekten der Interaktion auseinandersetzen.

Etwas aus diesem Projekt könnte immer noch auf den Knoten portiert werden, aber einige Dinge müssten immer noch in Java erledigt werden, weil Es gab viele verschiedene Berechnungen. Grundsätzlich könnten wir Teile auf einem Knoten erstellen, die bestimmte Teile in Java aufrufen und eine Microservice-Architektur verwenden. Sie könnten eine gemischte Version verwenden. Dieser Ansatz funktioniert aber nicht immer, weil Ein auf Knoten spezialisierter Entwickler ist möglicherweise kein Spezialist für Java und umgekehrt. Und es ist viel schwieriger, universelle Entwickler zu finden.

Aus Erfahrung auf node.js


Es gab ein Projekt, um eine große Datenmenge zu organisieren. Ähnliches wie das oben beschriebene Projekt. Nur hier laden wir eine Datei hoch, die eine Vielzahl von Informationen enthält und mehrmals und nach unterschiedlichen Regeln durch einen Drittanbieter-Service (in Java geschrieben) validiert werden muss. Es war notwendig, Hunderte von Gigabyte an Informationen zu verarbeiten, und der Knoten war dafür nicht vorgesehen.

Es war besonders interessant, die Systemarchitektur als zu entwerfen Die Anwendung bestand aus mehreren Mikrodiensten, einschließlich solcher von Drittanbietern. Bei der Arbeit mit einem Drittanbieter, der die Validierung durchgeführt hat, haben wir den RabbitMQ-Nachrichtenbroker verwendet. Wir haben die erforderlichen Informationen an einen Server eines Drittanbieters weitergegeben und nach Abschluss der Validierung eine Nachricht von RabbitMQ erhalten. Anschließend wurden die Daten in Teilen verarbeitet, um Speichermangel zu vermeiden.

Wenn die Anwendung ursprünglich eine Datei mit 10.000 Datensätzen verarbeitet hat, kann sie jetzt bis zu einer Million verarbeiten. Wir haben es immer noch geschafft, dieses Problem mit node.js zu lösen, obwohl es in Java einfacher gelöst werden konnte. Der Kunde wollte jedoch genau node verwenden, weil Ich brauchte eine einheitliche Infrastruktur und Architektur mit in JS geschriebenen Microservices. Die Verwendung von node zur Lösung des Problems war viel komplizierter und erforderte mehr Zeit, aber node.js gewinnt aufgrund der Skalierbarkeit. Deshalb können wir jetzt die Anzahl der Mitarbeiter erhöhen und immer mehr Daten verarbeiten. In Java wäre dies komplizierter.

Tatsächlich kann jedes Problem auf diese und jene Weise gelöst werden, aber es lohnt sich, dies hier zu wiederholen: Wenn viele Berechnungen vorhanden sind, ist es besser, Java zu verwenden. Wenn nicht viele Berechnungen vorhanden sind, können Sie Node sicher verwenden.

Zusammenfassung und Aussichten: Wird node.js Java überholen können?


Nun kommt es dazu, dass node.js häufig als Wrapper verwendet wird und die Füllung in anderen Sprachen geschrieben wird. Ihre Mängel sind seit langem bekannt. Beispielsweise wurde ein bedingter Fehler wie Single-Threading bereits behoben. Die neueste Version von Node bietet die Möglichkeit, mehrere Threads zu verwenden.

Java wurde ursprünglich als leichtgewichtige Lösung entwickelt, die C ++ ersetzt, und ist jetzt schwergewichtig geworden. Es ist wie Evolution. Vielleicht wird es eines Tages etwas geben, das den Knoten ersetzt.

Bild
Module - Java Development vs node.js

Nach der Anzahl der Bestellungen und nach meinen Gefühlen ist node.js Java bereits voraus.
JS entwickelt sich aktiv weiter und es wird sich ändern - vielleicht wird etwas kommen, um es zu ersetzen.
Jetzt gibt es keinen potenziellen Konkurrenten, der Java und node.js ersetzen könnte.

Das Problem ist, dass die Java-Entwicklung in letzter Zeit ziemlich langsam war und node.js sich mit einer solchen Geschwindigkeit entwickelt, dass es nicht möglich ist, sie in naher Zukunft zu ersetzen.

Source: https://habr.com/ru/post/de460125/


All Articles