Come Node.js gestisce migliaia di richieste
Si dice che Node.js sia single-threaded.
Eppure, gestisce migliaia di richieste, legge file e effettua chiamate API senza fermarsi.
Come funziona?
La risposta è libuv.
libuv è una libreria in C. Fornisce a Node.js capacità di I/O asincrone e non-blocking. JavaScript non può leggere file o gestire socket di rete autonomamente. Node.js usa libuv per comunicare con il sistema operativo.
Senza libuv, JavaScript si fermerebbe ogni volta che leggi un file. La tua applicazione diventerebbe non reattiva.
Con libuv, la lettura del file avviene in background. JavaScript continua a eseguire altro codice.
Esempio:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Output: Start End (contenuto del file)
Node.js stampa "End" prima che la lettura del file sia completata. Non aspetta.
Come libuv gestisce il tuo codice:
• L'Event Loop: libuv gestisce il loop che controlla se i task sono terminati. Inserisce i callback in una coda quando i task vengono completati. • Thread Pool: JavaScript utilizza un singolo thread. libuv utilizza un pool di worker thread. Di default, questo pool ha 4 thread. Questi thread gestiscono task pesanti come:
- Operazioni sul file system
- Ricerca DNS
- Compressione
- Crittografia • Networking: libuv gestisce i socket HTTP, TCP e UDP. Ciò consente ai server di gestire molte connessioni contemporaneamente. • Timer: libuv gestisce setTimeout e setInterval.
Il flusso di esecuzione funziona così:
- JavaScript esegue il tuo codice.
- libuv sposta i task pesanti in background.
- JavaScript passa alla riga successiva.
- libuv notifica l'Event Loop quando il task è completato.
- L'Event Loop esegue il tuo callback.
Pensa a una pizzeria.
Senza libuv, rimani al bancone e chiedi "Il mio cibo è pronto?" ogni dieci secondi. Blocchi la fila.
Con libuv, ordini, ti siedi e aspetti una notifica. Sei libero di fare altro finché la pizza non è pronta.
Riassunto:
• Esecuzione JavaScript: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timer: libuv
libuv è il motore che mantiene Node.js veloce.
