It’s #FrontendFriday – Basics zu Node.js

09.09.2019

Vor ein paar Monaten gab es von mir bereits einen Workshop zum Thema Node.js + Express. Da es meiner Meinung nach noch eine viel zu unterschätze Technologie ist wollte ich diesen #FrontendFriday in komprimierter Form nutzen um auch allen anderen einen Einblick zu geben, die beim Workshop nicht dabei sein konnten.

Was ist Node.js?

Node.js ist eine Technologie, mit der sich Server-side JavaScript ausführen lässt. Der ein oder andere wird sich jetzt denken „Server und JavaScript?“. Genau! Node.js wird in der JavaScriptLaufzeitumgebung „V8“ausgeführt, die ursprünglich für Google Chrome entwickelt wurde, und bietet eine ressourcensparende Architektur, die eine besonders große Anzahl gleichzeitig bestehender Netzwerkverbindungen ermöglicht. Unter anderem gibt es auch ein breites Einsatzspektrum von Command-Line Tools bis HTTP-Servern. Produktiv wird diese Technologie auch bei zahlreichen großen Unternehmen eingesetzt wie zum Beispiel bei Google, Netflix, PayPal, eBay, Twitter, NASA, Uber, etc.

Bekannt ist Node.js auch durch den häufig verwendeten MEAN-Stack (Mongo-DB, Express, Angular, Node.js ) oder den MERN-Stack (Mongo-DB, Express, React.js, Node.js).

Wie funktioniert Node.js?

Node.js verwendet JavaScript und ergänzt die Sprache um weitere Features wie Operationen auf dem Filesystem, die normalerweise mit JavaScript im Browser (aus Sicherheitsgründen) nicht möglich sind. Die V8 Engine ist in C++ implementiert und kompiliert den JavaScript Code in Maschinencode was die Node.js Anwendung letztendlich „Blazing fast“ macht.

Die Skriptsprache JavaScript gibt eine ereignisgesteuerte Architektur vor. Diese hat im Serverbetrieb den Vorteil, pro bestehender Verbindung weniger Arbeitsspeicher zu verbrauchen als bei vergleichbaren Anwendungen, die für jede geöffnete Verbindung einen eigenen Thread starten.  

Node.js wird mit besonderem Fokus auf die Performance entwickelt. So kommt standardmäßig non-blocking I/O zum Einsatz. Dadurch werden Zugriffe auf das Netzwerk oder Dateisystem von Node.js in Threads gestartet (Asynchron), damit diese mit dem Prozessor vergleichbar langsamen Operationen nicht den Ablauf der Anweisungen verlangsamen. Daraus resultiert, dass Node.js Anwendungen Asynchron programmiert werden.

Zum besseren Verständnis noch der Unterschied zwischen Blocking I/O und non-Blocking I/O.

Blocking I/O

Java oder .Net Server verwenden das „Blocking I/O“ Prinzip. Dabei wird jedes Mal bei einer eingehenden Verbindung bzw. bei einem Request ein eigener Thread  gestartet was zulasten der Ressourcen geht. Kommt dieser Server an die Grenze seiner Ressourcen müssen nachfolgende Request warten, bis es wieder freie Ressourcen gibt. Sprich weitere Operationen werden blockiert bis bestehende Operationen abgeschlossen sind. Das Ganze ist vergleichbar mit der Kasse im Supermarkt. Selbst wenn alle verfügbaren Kassen geöffnet haben muss man sich irgendwo einreichen auch wenn man selber nur ein Eis kaufen möchte aber die Person vor einem den ganzen Wocheneinkauf auf dem Band hat.

 

Non-Blocking I/O

Node.js ist single-threaded und verwendet das non-Blocking I/O Prinzip. Hierbei können Requests bzw. I/O Aufgaben jederzeit entgegengenommen werden ohne zu blockieren. Anhand des implementierten Schedulers in Node.js, wird entschieden welche Anwendungen mit welcher Priorität asynchron abgearbeitet werden. Somit kann es zum Beispiel sein, dass Requests die erst später eingetroffen sind trotzdem schneller einen Response vom Server bekommen, da die Anfrage keinen hohen Rechenaufwand benötigt. Das Ganze ist vergleichbar mit einem Restaurant. Der Kellner nimmt von jedem Tisch die Bestellungen auf und gibt sie an die Küche weiter. Irgendwann fällt einem auf, dass manche Gäste ihre Bestellung schon bekommen haben, obwohl sie erst später dazu gekommen sind. Dies Gäste haben aber nur einen Salat bestellt anstelle eines ganzen Menüs was weniger Zeit für die Zubereitung benötigt.

 

Vorteile / Nachteile

Vorteile:

Um den Rahmen dieses Beitrags nicht zu sprengen, kann ich leider nicht auf jeden Vorteil im Detail eingehen daher hier eine grobe Zusammenfassung

  • Eine Programmiersprache für Frontend und Backend (JavaScript)
  • Sehr performant bei I/O Aufgaben
  • Hohe Skalierbarkeit
  • Sehr ausfallsicher (Zero Downtime)
  • Ressourcensparend
  • Große Community
  • Viele fertige und gute Libraries (npm package)

Nachteile:

  • Man ist nicht gezwungen nach OOP zu entwickeln
  • Asynchroner Code ist komplexer
  • (Keine Typsicherheit außer bei der Verwendung von TypeScript)

Wann eignet sich Node.js / Wann eignet sich Node.js nicht

Es gibt viele Anwendungsfälle in denen es sich Lohnt auf Node.js zu bauen. Wiederum gibt es spezielle Fälle, wofür es sich überhaupt nicht eignet.

Hier eine grobe Orientierung:

Use it:

  • Die Anwendung verwendet viele I/O Operationen wie:
    • HTTP Requests
    • Filesystem Zugriffe
    • Datenbank Zugriffe
    • Sensordaten
    • Tastatur/Maus Eingaben
    • ….
  • Skalierung / Clustering ist ein wichtiges Thema bei der Anwendung
  • Zero Downtime
  • Microservice Architektur

Don’t use it:

  • CPU-lastige Aufgaben wie
    • Video encoding
    • 3D Rendering
    • ….

Server Beispiel

Abschließend noch ein kurzer Codeschnipsel. Hierbei ist zu sehen wie man mit Node.js und Express mit knapp 20 Zeilen Code einen lauffähigen HTTP Server baut inkl. einer GET und POST Schnittstelle.

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.json());

app.listen(3000, function() {
    console.log("Server listening on port 3000 ...")
})

app.get('/', function(req, res) {
    console.log("Incoming request ....")
    res.send("Hello World");
})

app.post('/workshop/post', (req, res) => { //POST
    console.log(req.body);
    res.send("test");
})

 

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*