Hoe Node.js duizenden verzoeken afhandelt
Mensen zeggen dat Node.js single-threaded is.
Toch handelt het duizenden verzoeken af, leest het bestanden en doet het API-aanroepen zonder te stoppen.
Hoe werkt het?
Het antwoord is libuv.
libuv is een C-bibliotheek. Het geeft Node.js asynchrone en niet-blokkerende I/O-mogelijkheden. JavaScript kan niet zelfstandig bestanden lezen of netwerk-sockets beheren. Node.js gebruikt libuv om met je besturingssysteem te communiceren.
Zonder libuv zou JavaScript stoppen elke keer dat je een bestand leest. Je app zou onresponsief worden.
Met libuv wordt het bestand op de achtergrond gelezen. JavaScript blijft andere code uitvoeren.
Voorbeeld:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Output: Start End (inhoud van het bestand)
Node.js print "End" voordat het bestand klaar is met lezen. Het wacht niet.
Hoe libuv je code beheert:
• De Event Loop: libuv draait de loop die controleert of taken zijn voltooid. Het plaatst callbacks in een wachtrij wanneer taken klaar zijn. • Thread Pool: JavaScript gebruikt één thread. libuv gebruikt een pool van worker threads. Standaard heeft deze pool 4 threads. Deze threads handelen zware taken af zoals:
- Bestandssysteem-bewerkingen
- DNS-lookups
- Compressie
- Cryptografie • Netwerk: libuv beheert HTTP-, TCP- en UDP-sockets. Hierdoor kunnen servers veel verbindingen tegelijkertijd afhandelen. • Timers: libuv handelt setTimeout en setInterval af.
De executievolgorde werkt als volgt:
- JavaScript voert je code uit.
- libuv verplaatst zware taken naar de achtergrond.
- JavaScript gaat door naar de volgende regel.
- libuv informeert de Event Loop wanneer de taak klaar is.
- De Event Loop voert je callback uit.
Denk aan een pizzeria.
Zonder libuv sta je aan de toonbank en vraag je elke tien seconden: "Is mijn eten al klaar?". Je blokkeert de rij.
Met libuv bestel je, ga je zitten en wacht je op een melding. Je bent vrij om andere dingen te doen totdat de pizza klaar is.
Samenvatting:
• JavaScript-executie: V8 Engine • Event Loop: libuv • File I/O: libuv • Netwerk: libuv • Timers: libuv
libuv is de motor die Node.js snel houdt.
