Konzepte & Funktionalitäten


... [ Seminar Programmiersprachen und virtuelle Maschinen ] ... [ node.js ] ... [ << Motivation ] ... [ Architektur >> ] ...

Event Loop

Der Event-Loop ist die zentrale Kontrollstruktur in Node.js. Der Event-Loop empfängt Events, die von Programm- oder Nutzeraktionen ausgelöst werden und setzt diese in Callback-Funktionen um. Der gesamte Progammablauf wird also durch den Event-Loop gesteuert. Als Beispiel kann hier eine zeitintensive Berechnung herangezogen werden. Diese zeitintensive Berechnung wird in einen neuen Prozess ausgelagert und mit einer Callback-Methode versehen, die ausgeführt werden soll, sobald diese Berechnung abgeschlossen ist. In der Zeit der Berechnung kann der Event Loop weitere Events bearbeiten, die zwischenzeitlich aufgelaufen sind. Wenn die Berechnung abgeschlossen ist, wird dies dem Event-Loop signalisiert und sobald die aktuelle den Event loop blockierende Funktion abgeschlossen ist, wird die zuvor definierte Callback Funktion der Berechnung ausgeführt und so dieser Teil des Programms fortgesetzt. Dieser Vorgang kann ständig parralel und endlos stattfinden.

Single-Threaded

Node ist Single-Threaded, was bedeutet, dass alle Berechnung und Aktionen die im Kontext des Event-Loops ausgeführt werden seriell abgearbeitet werden müssen. Dies ist solange kein Problem, wie teure Aktionen aus dem Event-Loop heruasgelöst und mit einer Callback-Funktion versehen werden, um nach erfolgreicher Beendigung wieder in den Event-Loop zurückkehren zu können. Das Node aber nur einen Thread hat ist allerdings auch ein großer Vorteil. So können keine der bekannten Probleme der Nebenläufigkeit entstehen: Mutex-Locks, Thread-Safety-Probleme, Race Conditions, etc.

non-blocking I/O

Damit sich ein Event-Loop sinnvoll einsetzen lässt, müssen auch sämtliche I/O Operationen non-blocking sein, damit wie schon zuvor angesprochen, der Event-Loop möglichst nur zum Empfang und zur Delegation von Events genutzt werden kann. Ausserdem lässt sich so die Performance jeder Anwendung beträchtlich steigern, wenn die gesamte Anwendung nicht auf teure I/O Prozesse warten muss. Das Prinzip ist das seleb wie schon unter Event-Loop angesprochen. Jede I/O Operation wird aus dem Event Loop ausgelagert und mit einer Callback Funktion versehen. Ist die Operation abgeschlossen wird dies dem Event-Loop signalisiert, woraufhin dieser die entsprechende Callback Funktion aufruft und das Programm so weiterführt.

HTTP 1.1

Die in Node eingebaute HTTP Unterstützung unterstützt alle Features, die HTTP 1.1 mit sich bringt. Einige dieser Features kommen Node sehr entgegen. So werden Chunked Requests und Responses unterstützt. Dies ermöglicht es z.B. Responses stückweise auszuliefern, was dem von Node genutzten Event-Loop Modell sehr entgegenkommt, da ansonsten halb abgearbeitete Requests zwischengespeichert werden müssten. Dies bedeutet wiederum erhöhten Speicher- und Verwaltungsaufwand. Mit Chunked Responses ist es möglich, sobald eine Berechnung abgeschlossen ist, die Ergebnisse sofort zum Client zu schicken.
Ausserdem wird keep-alive unterstützt. Dies ist insbesondere wichtig um Node als Server für COMET oder ähnliche Long-Polling Funktionen zu verwenden. Hierbei wird eine Verbindung trotz Inaktivität weiterhin aufrechterhalten um so einen schnellen Datenstrom bei Bedarf zu ermöglichen.

Protokollunterstützung

Node bietet von Haus aus Unterstützung für die populärsten Protokolle UDP, DNS, HTTP, HTTPS und TCP. Natürlich wird bei diesen Implementierungen darauf geachtet, dass alle I/O-Funktionen non-blocking sind.

CommonJS

Node nutzt CommonJS. CommonJS ist eine Standard Library für JavaScript, die UNterstützung bietet bei vielen Dingen, die ausserhalb des Browsers möglich sind. CommonJS hat den Anspruch ähnlich vollständig in seiner Funktionalität zu sein, wie Ruby Standard Library oder äquivalente für Java oder Python. Mit CommonJS wird JavaScript universell auch ausserhalb des Browsers einsetzbar, da hier z.B. Dateisystemfunktionen definiert werden.


... [ Seminar Programmiersprachen und virtuelle Maschinen ] ... [ node.js ] ... [ << Motivation ] ... [ Architektur >> ] ...