Posted on Leave a comment

Was ist NodeJS?

Was ist NodeJS?

Webanwendungen spielen in der Softwareentwicklung eine immer größere Rolle. Klassischerweise wird dazu ein Frontend (die Nutzeroberfläche) gesondert vom Backend (dem dahinterliegenden Server) entwickelt. Für die Gestaltung der Oberfläche haben sich seit Jahren HTML bzw. HTML5 und CSS bewährt. Um Logik auch im Frontend zu implementieren, wird gerne auf die Skriptsprache JavaScript zurückgegriffen. Im Backend hingegen kommen vor allem Sprachen wie Python, Ruby oder PHP zum Einsatz.

Das hat mittlerweile allerdings einige Nachteile: Zum einen verwendet JavaScript für die Darstellung von Objekten das JSON-Format (JavaScript Object Notation), das für die Kommunikation mit dem Backend ständig hin und zurück konvertiert werden muss, wenn dort nicht das gleiche Format verwendet wird. Zum anderen ist es immer vorteilhaft, wenn im gesamten Technologie-Stack – der Gesamtheit aller Technologien, die für ein Projekt verwendet werden – nur eine Sprache verwendet wird. Zuletzt sind klassische Entwurfs- und Kommunikationsmuster für Webserver nicht unbedingt auf moderne Anforderungen wie Geschwindigkeit, die Bereitstellung von Informationen in Echtzeit und das Handhaben vieler Verbindungen gleichzeitig ausgelegt. NodeJS bietet einen Ansatz, auch serverseitig JavaScript zu verwenden, um damit einige dieser Probleme zu lösen.

Was ist NodeJS?


NodeJS ist eine Plattform zur serverseitigen Softwareentwicklung und zum Betrieb von Netzwerk- und Webanwendungen. Die Plattform unterstützt event-getriebene Programmierung, das heißt der Programmfluss wird durch die Interaktion mit dem Nutzer gelenkt. Die Programmiersprache, die NodeJS zu Grunde liegt, ist wie bereits erwähnt JavaScript. Mit NodeJS kann JavaScript außerhalb des Browsers plattformunabhängig, also sowohl auf Linux, Windows und iOS/ MacOS, ausgeführt werden. Der Fokus bei der Entwicklung von NodeJS lag insbesondere auf einer ressourceneffizienten Architektur und der besseren Unterstützung mehrerer Netzwerkverbindungen – doch wie genau schafft NodeJS das?

Wie ist NodeJS aufgebaut?

Der Kern von NodeJS ist die V8-Engine von Google, eine Laufzeitumgebung für JavaScript, die ursprünglich für den Browser Google Chrome entwickelt wurde, aber auch eigenständig eingesetzt werden kann. Eine Laufzeitumgebung umfasst alle Voraussetzungen, die zur Ausführung eines Programmes bzw. von Programmcode nötig sind. Die V8-Engine ist Open Source und entsprechend ist auch NodeJS frei verfügbar.

Die beiden wichtigsten Bestandteile von NodeJS selbst sind eine Event-Loop und eine Schnittstelle für Ein- und Ausgabeanweisungen, sogenannten I/O-Anweisungen (von engl. Input / Output). In der Event-Loop werden Anfragen entgegengenommen und ausgeführt. Für einen effizienten Webserver ist es notwendig, dass die angenommenen Anfragen asynchron abgearbeitet werden. Das heißt, der Server blockiert nicht bis er die Antwort zu einer Anfrage errechnet hat, sondern kann bevor er antwortet bereits weitere Anfragen entgegennehmen.

Viele Webserver nutzen dazu mehrere Prozesse (Threads), sind also multi-threaded. Das bedeutet, dass für jede eingehende Anfrage ein eigener Prozess erstellt wird, der gleichzeitig mit allen anderen Prozessen abgearbeitet wird. Der Nachteil von Multi-Threading ist zum einen die erhöhte Komplexität während der Entwicklung und zum anderen der höhere Ressourcenaufwand: Jeder Prozess benötigt eine eigene Menge Arbeitsspeicher. Zudem ist der Wechsel zwischen den Threads meist “teuer”, kostet also viele Rechenressourcen und Zeit.

Im Gegensatz dazu ist NodeJS single-threaded, das heißt es wird kein eigener Thread pro Anfrage erzeugt. Damit der Webserver trotzdem asynchron arbeiten kann, wird eine Event-Loop mit nicht-blockierenden I/O-Befehlen verwendet. Am besten kann man sich das an einem Beispiel wie dem Lesen aus dem Dateisystem vorstellen: Den NodeJS-Server erreicht eine Anfrage, eine bestimmte Datei zu lesen. Diese Anfrage muss lediglich an das Betriebs- bzw. Dateisystem weitergeleitet werden. Dieses kümmert sich dann um die Ausführung und sendet schließlich ein Callback an NodeJS zurück. In der Zwischenzeit kann NodeJS sich über die Event-Loop um andere Anfragen kümmern.

Dadurch bricht NodeJS ein weiteres Paradigma, was bisher der Standard für Webserver war. Anfragen folgen klassisch dem Schema, dass sie versendet, ausgeführt und beantwortet werden und die Verbindung anschließend beendet wird. Nun bleibt die Verbindung zwischen Client und Server aufrecht, d.h. NodeJS kann und muss die Verbindung mit mehreren Clients gleichzeitig unterhalten.

Wo wird NodeJS in der Praxis verwendet?


Die Anzahl der NodeJS-Nutzer steigt stetig an – 2017 gab es bereits 4 Millionen User. Unter den Nutzern sind bekannte Unternehmen wie PayPal, Netflix oder Walmart, die zeigen, dass NodeJS in der Praxis echtes Potential hat. Wichtig für NodeJS Anwendungen ist, dass sie nicht rechenintensiv sein sollten. Zwar sind die I/O-Operationen von NodeJS nicht blockierend, da NodeJS selbst allerdings nur einen Thread besitzt, führen rechenintensive Operationen direkt im NodeJS-Code trotzdem dazu, dass der Webserver nur langsam reagiert. Dadurch geht einer der größten Vorteile von NodeJS, nämlich seine Schnelligkeit, verloren. Dementsprechend sind Anwendungsgebiete für NodeJS:

Single Page Applications

Eine Single Page Application ist eine Webseite, die sich dynamisch ändert, anstatt immer wieder vollständig neue Seiten vom Server nachzuladen. Auf die Interaktion des Nutzers hin werden die benötigten Ressourcen asynchron angefragt und in die Seite eingefügt. Dafür ist es notwendig, mit einem reaktiven und schnellen Backend zu kommunizieren, und genau dafür ist NodeJS gedacht.

Streaming-Dienste und Chat-Systeme

Wie bereits mehrfach erwähnt ist NodeJS vor allem für Echtzeit-Applikationen relevant. Dementsprechend sind Streaming-Dienste und Chat-Systeme Hauptanwendungsfälle für NodeJS. Beide Anwendungen haben relativ wenige Operationen mit hohem Rechenaufwand, sind dafür aber mit vielen I/O-Anfragen datenintensiv und haben potentiell sehr viele Netzwerkverbindungen, die gleichzeitig bedient werden müssen.

Proxies

NodeJS kann als Proxy, also als Zwischenschicht oder Vermittler, zwischen einem Client und einem oder mehreren Servern liegen. NodeJS baut die Verbindung zum Client auf, nimmt die Anfragen an und leitet sie weiter. Während NodeJS auf die Callbacks wartet, können weitere Anfragen angenommen und delegiert werden. Sobald die Callbacks eingehen, werden sie zum Client zurückgeleitet. Dadurch können vor allem unterschiedliche Reaktionszeiten bei der Abfrage von Daten von verschiedenen Endpunkten abgefangen und für den Endnutzer gepuffert werden. Weiterhin ist es möglich, die unterliegende Komplexität der Server, die zur Beantwortung eines Requests angefragt werden müssen, nach außen zu verbergen.

Datenschnittstellen

NodeJS hat seine große Stärke zwar im Versenden von Daten in Echtzeit, kann aber auch gut als Datenschnittstelle zu einer Datenbank genutzt werden. Wichtig dabei ist, dass die unterliegende Datenhaltung am besten auf der JavaScript Object Notation (JSON) basieren sollte. Dabei handelt es sich um ein kompaktes, menschenlesbares Datenformat, das die Daten mithilfe von geschweiften Klammern strukturiert. Im Grunde kann eine Datei im JSON-Format einfach als Zuordnung von Schlüssel-Wert-Paaren verstanden werden.

Die JSON-Beschreibung

{“length”: “5”, “width”: “7”, “unit”: “cm”}

würde beispielsweise ein Objekt, möglicherweise ein Rechteck, mit dem Seitenlängen 5cm und 7cm beschreiben.

MongoDB oder CouchDB sind Datenbanken, die Informationen im JSON-Format speichern, und sich daher gut für die Verwendung zusammen mit NodeJS eignen. Das hat den Vorteil, dass keine Umwandlung der Daten von Datenbank zu Server und zu Client notwendig ist – das Format wird auf allen Ebenen verstanden.

Die NodeJS Community und NPM


Ein weiterer Aspekt von NodeJS ist die große Community. Es gibt sehr viele Blogs und Tutorials, die einen guten Einstieg in die Plattform und Schritt für Schritt-Anleitungen für erste eigene Projekte geben. Zudem gibt es diverse Module und Bibliotheken, die direkt in NodeJS-Code eingebunden werden können. Diese können über den Node Package Manager (NPM), der direkt in NodeJS integriert ist, hinzugefügt werden. Auch NPM wird unter der Open Source-Lizenz vertrieben.

Fazit


Zur Implementierung schneller und effizienter Webserver ist NodeJS sicherlich eine gute Wahl. Die Sprache ist plattformunabhängig, Open Source und event-getrieben, richtet den Programmfluss als nach der Nutzerinteraktion aus. Sie ermöglicht es, sowohl für die Frontend- als auch die Backendentwicklung dieselbe Sprache zu verwenden. Im Gegensatz zu anderen serverseitigen Sprachen arbeitet NodeJS nicht mit einem Prozess pro Anfrage, sondern besitzt nur einen Thread. In diesem Thread läuft eine sogenannte Event-Loop, die Anfragen entgegennimmt und asynchron weiterleitet. Während NodeJS auf die Antwort des Requests in Form eines Callbacks wartet, können weitere Anfragen entgegengenommen werden. Dadurch ist NodeJS auf der einen Seite effizient und auf der anderen Seite ressourcensparend – denn jeder neue Prozess würde Arbeitsspeicher verbrauchen.

Entsprechend ist NodeJS sehr gut geeignet, wenn der Webserver viele Netzwerkverbindungen gleichzeitig bedienen oder Daten in Echtzeit versenden soll. Für Anwendungen, bei denen auch der Server rechenintensive Operationen durchführen muss, ist NodeJS allerdings ungeeignet, denn der NodeJS-Code selbst hat zur Berechnung eben nur einen Thread zur Verfügung.

Ähnliche Produkte

Schreibe einen Kommentar