Wie Node.js Tausende von Anfragen verarbeitet
Man sagt, Node.js sei single-threaded.
Dennoch verarbeitet es tausende Anfragen, liest Dateien und führt API-Aufrufe aus, ohne anzuhalten.
Wie funktioniert das?
Die Antwort ist libuv.
libuv ist eine C-Bibliothek. Sie verleiht Node.js asynchrone und nicht-blockierende I/O-Fähigkeiten. JavaScript kann Dateien nicht selbstständig lesen oder Netzwerk-Sockets verwalten. Node.js nutzt libuv, um mit dem Betriebssystem zu kommunizieren.
Ohne libuv würde JavaScript jedes Mal anhalten, wenn eine Datei gelesen wird. Deine App würde nicht mehr reagieren.
Mit libuv wird die Datei im Hintergrund gelesen. JavaScript führt weiterhin anderen Code aus.
Beispiel:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Ausgabe: Start End (Dateiinhalt)
Node.js gibt "End" aus, bevor das Lesen der Datei abgeschlossen ist. Es wartet nicht.
Wie libuv deinen Code verwaltet:
• Der Event Loop: libuv führt die Schleife aus, die prüft, ob Aufgaben abgeschlossen sind. Wenn Aufgaben fertig sind, werden die Callbacks in eine Warteschlange gestellt. • Thread Pool: JavaScript nutzt einen Thread. libuv nutzt einen Pool von Worker-Threads. Standardmäßig hat dieser Pool 4 Threads. Diese Threads übernehmen schwere Aufgaben wie:
- Dateisystem-Operationen
- DNS-Abfragen
- Kompression
- Kryptografie • Networking: libuv verwaltet HTTP-, TCP- und UDP-Sockets. Dies ermöglicht es Servern, viele Verbindungen gleichzeitig zu verarbeiten. • Timer: libuv übernimmt setTimeout und setInterval.
Der Ausführungsablauf funktioniert so:
- JavaScript führt deinen Code aus.
- libuv verschiebt schwere Aufgaben in den Hintergrund.
- JavaScript fährt mit der nächsten Zeile fort.
- libuv benachrichtigt den Event Loop, wenn die Aufgabe erledigt ist.
- Der Event Loop führt deinen Callback aus.
Stell dir eine Pizzeria vor.
Ohne libuv stehst du am Tresen und fragst alle zehn Sekunden: "Ist mein Essen fertig?". Du blockierst die Schlange.
Mit libuv bestellst du, setzt dich hin und wartest auf eine Benachrichtigung. Du bist frei, andere Dinge zu tun, bis die Pizza fertig ist.
Zusammenfassung:
• JavaScript-Ausführung: V8 Engine • Event Loop: libuv • File I/O: libuv • Netzwerk: libuv • Timer: libuv
libuv ist der Motor, der Node.js schnell hält.
