Warum Node.js und Full Stack JavaScript die etablierten Programmiersprachen im Enterprise Umfeld ablösen wird...

von Alexander Vukovic

Node.js is everywhere! Node.js ist eine Laufzeitumgebung für Backend-Javascript Applikationen. Als open-source und cross-platform Applikation konzipiert, ist Node.js auf jeder gängigen Serverplatform verfügbar.

Die Anfänge von Node.js liegen im Jahr 2009, als Ryan Dahl Node.js entwickelt und auf der JSConf 2009 vorgestellt hat.

Die Laufzeitumgebung kombiniert die stärkste verfügbare JavaScript Engine, nämlich Googles V8 zusammen mit einer Event Loop und einem Subsystem für asynchrone I/O-Vorgänge. Später kam auch ein Paketmanager für Node.js genannt npm dazu.

Anfängliche Uneinigkeit in der Community führten 2014 zu einem Community-Fork von Node.js, dieser wurde aber später wieder mit dem Core Projekt vereint und heute wird Node.js von der OpenJS-Foundation definiert und weiterentwickelt.

Heute ist Node.js eine ernsthafte Konkurrenz für die etablierten Größen wie Java, .Net oder PHP.

Aber warum ist das so? Warum setzen wir bei razzfazz.io primär auf Node.js?

Die Antworten sind vielfältig, hier eine Auswahl:

Node.js ist für die Entwicklung von I/O-lastigen Backends optimiert und erreicht erstaunliche Performance

Microservices sind das heute gängige Architekturpattern. Diese meist atomaren kleinen Einheiten bilden einen kleinen Teil einer größeren Applikation isoliert entwickelbar, deploybar und skalierbar ab. Dabei werden häufig nur Daten zwischen Microservices vermittelt oder aus einer Datenbank gelesen oder in diese gespeichert.

Klassische Ansätze, wie sie Java oder .Net verfolgen basieren auf Multithreading. D.h. ein neuer Request an den Applikationsserver führt dazu, dass ein neuer Thread eröffnet wird, dieser liest dann Daten aus der Datenbank, indem er mehrere Queries gegen die Datenbank absetzt und auf deren Ergebnisse wartet. Aus den Ergebnissen wird möglicherweise eine Antwort aggregiert und als Antwort auf den ursprünglichen Request zurückgeschickt.

D.h. der Thread besteht für die Dauer bis der Request vollständig abgearbeitet wurde. Das könnte bei hoher Belastung dazu führen, dass zu viele Threads gleichzeitig offen sind und z. B. im Falle von Java die JVM an ihre Grenzen stößt.

PHP läuft beispielsweise in Worker Threads des Webservers, die auch wiederum limitiert sind und bei hoher Last geshared werden müssen.

Node.js löst dieses Problem vollkommen anders. Eine Node-Instanz besteht im ersten Schritt aus genau einem Thread, der die sogenannte Event Loop betreibt. Sobald ein Request eintrifft entsteht ein Event, das abgearbeitet wird. Die Abarbeitung erfolgt dann durch sogenanntes Non-Blocking IO, d.h. Node ist dazu in der Lage IO-Requests in parallelen Threads zu starten und auf deren asynchrones Ergebnis zu warten. Im Falle einer Datenbankoperation würde eine Query abgesetzt werden, die Event Loop wartet nicht auf das Ergebnis, sondern, sobald das Ergebnis vorliegt, wird ein neues Event in der Event Loop generiert und im Javascript Code auf dieses asynchrone Event reagiert. Für hardwarenahes IO wie Netzwerk und Disk IO wird dieses in einen zusätzlichen Thread Pool ausgelagert.

Abbildung: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

Der große Vorteil dieses Ansatzes liegt darin, dass sehr IO-lastige Applikationen mit viel weniger Threads und mit viel effizienterer Ressourcennutzung auskommen. Mit Node.js sind deshalb viel performantere und skalierbarere Applikationen möglich.

Der Nachteil von Node entsteht bei rechenintensiven Operationen, wie z. B. komplexen Kalkulationen. Diese blockieren die Eventloop und führen dadurch zu einer deutlichen Verlangsamung. Hierfür bietet Node zwar auch Workarounds mit echten Threads, aber man muss klar sagen, dass hierfür z. B. die Entwicklung einer C++-Extension zu Node zu einem performanteren Ergebnis führen.

Für I/O-lastige Aufgabenstellungen hingegen ist Node.js unschlagbar.

Node.js ist durch die riesige Community effizient zu entwickeln

Nach anfänglichem Hickhack in der Node Community hat sich eine non-profit Organisation zur Weiterentwicklung von Node.js gebildet, die nunmehr seit vielen Jahren für eine stabile Weiterentwicklung sorgt. Das Zusammenspiel mit dem Node Package Manager Repository (NPM, www.npmjs.com) hat dazu geführt, dass eine riesige Entwicklungscommunity entstanden ist, die frei kommerziell verwendbare Frameworks und Lösungen auf Basis von Node bereitstellt.

Abbildung: SEQIS GmbH

Am Beispiel von express sieht man, wie intensiv Node.js bereits weltweit genutzt wird. Das Framework express ermöglicht es extrem effizient einen Webserver aufzubauen und ist deshalb weit verbreitet. Aktuell wird es rund 16 Millionen mal pro Woche heruntergeladen und verwendet. So wie express gibt es Millionen von Frameworks, für so ziemlich jede Problemstellung, die sich bei der Entwicklung von Backends oder Microservices stellen.

Die gleiche Programmiersprache im Frontend und im Backend

Im Bereich der Webclients im Browser hat sich Javascript seit vielen Jahren bereits durchgesetzt. Sobald eine Lösung einen Webclient mit etwas mehr Interaktivität benötigt, ist es notwendig, dass die Entwickler auch Javascript sprechen.

Deshalb ist es naheliegend, die gleiche Programmiersprache für das Backend zu verwenden. Daraus ergeben sich weitere Sharingmöglichkeiten und die Möglichkeit den Code aus dem Backend für das Frontend wiederzuverwenden.

Optimierte Entwicklungsumgebungen ermöglichen erstaunliche Entwicklungsgeschwindigkeit

Ein gewichtiges Argument für Node.js ist die Performance. Dabei geht es nicht nur um die Ausführungsgeschwindigkeit (siehe Optimierung für I/O-lastige Aufgaben). Es geht auch um die Entwicklungsperformance. Das Node.js Ökosystem weißt einen sehr hohen Entwicklungsautomationsgrad auf, Scaffolding ermöglicht einen leichten Start für ein Projekt, in dem bereits alle Tools ebenfalls bereitstehen (z. B. Unit Test Framework, Oberflächenautomation, Buildautomation, etc.)

Die Buildschritte werden über ein ebenfalls Node.js basiertes Command Line Interface automatisiert, es ist dem Entwickler immer möglich, Veränderungen vorzunehmen und einzugreifen. Dabei hilft auch die extensive Unterstützung bei der Entwicklung durch das Integrated Development Environment (IDE). Dabei hat sich Visual Studio Code neben IntelliJ Webstorm als die beste Lösung herauskristallisiert.

Node.js ermöglicht es mit sehr wenig Zeilen Code sehr viel Funktionalität zu schaffen. Das in Kombination mit dem ganzen Toolstack ermöglicht erstaunliche Zeitgewinne bei der Entwicklung, die Node.js damit outstanding machen. Insbesondere zu den traditionellen Sprachen wie Java und .Net.

Node.js ermöglicht entwicklungsnahe Qualität von Anfang an

Insbesondere Unit Tests sind ein herausragendes Werkzeug, um Qualität in einer Lösung von Anfang an miteinzubauen. Als feinmaschiges Fallnetz ermöglichen die Unit Tests jede Veränderung direkt abzusichern und bei jedem Speichern mitzulaufen.

Node.js bietet hier viele Möglichkeiten für das Mocking und das schnelle Erstellen von Unit Tests.

Über NPM wird auch die Qualität der verwendeten Pakete sichergestellt und z. B. geprüft, ob es neue bekannte Security-Lücken in einem verwendeten Paket gibt und ein Upgrade empfohlen wird.

Warum also Node.js statt ... ?

Wir haben uns für Node.js entschieden, da Node.js die moderne Basis für moderne Applikationen darstellt. Von Anfang an mit Qualität und Performance gedacht und höchst effizient umgesetzt sichert uns Node.js einen entscheidenden Wettbewerbsvorteil gegenüber anderen Lösungsanbietern.

Wir sind überzeugt, dass in den nächsten Jahren Node.js seinen aktuellen Erfolg im Enterprise Umfeld fortsetzen wird und die historisch etablierten Sprachen wie Java und .Net sukzessive verdrängen wird.

Wenn Sie Fragen zur Einführung von Node.js in Ihrem Entwicklungsteam haben, wenden Sie sich gerne an uns: Wir unterstützen Sie gerne und teilen unsere Erfahrungen mit Ihnen.

www.razzfazz.io

Zurück

Zum Seitenanfang navigieren