Bagaimana Node.js Menangani Ribuan Permintaan
Banyak yang mengatakan Node.js bersifat single-threaded.
Namun, ia mampu menangani ribuan permintaan, membaca file, dan melakukan panggilan API tanpa berhenti.
Bagaimana cara kerjanya?
Jawabannya adalah libuv.
libuv adalah sebuah library C. Ia memberikan kemampuan I/O asynchronous dan non-blocking pada Node.js. JavaScript tidak dapat membaca file atau mengelola socket jaringan secara mandiri. Node.js menggunakan libuv untuk berkomunikasi dengan sistem operasi Anda.
Tanpa libuv, JavaScript akan berhenti setiap kali Anda membaca file. Aplikasi Anda akan menjadi tidak responsif.
Dengan libuv, pembacaan file dilakukan di latar belakang. JavaScript terus menjalankan kode lainnya.
Contoh:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Output: Start End (isi file)
Node.js mencetak "End" sebelum file selesai dibaca. Ia tidak menunggu.
Bagaimana libuv mengelola kode Anda:
• The Event Loop: libuv menjalankan loop yang memeriksa apakah tugas telah selesai. Ia memasukkan callback ke dalam antrean saat tugas selesai. • Thread Pool: JavaScript menggunakan satu thread. libuv menggunakan kumpulan (pool) worker threads. Secara default, pool ini memiliki 4 thread. Thread ini menangani tugas-tugas berat seperti:
- Operasi sistem file
- Pencarian DNS
- Kompresi
- Kriptografi • Networking: libuv mengelola socket HTTP, TCP, dan UDP. Hal ini memungkinkan server untuk menangani banyak koneksi sekaligus. • Timers: libuv menangani setTimeout dan setInterval.
Alur eksekusinya bekerja seperti ini:
- JavaScript menjalankan kode Anda.
- libuv membawa tugas-tugas berat ke latar belakang.
- JavaScript melanjutkan ke baris berikutnya.
- libuv memberi tahu Event Loop saat tugas selesai.
- Event Loop menjalankan callback Anda.
Bayangkan sebuah toko pizza.
Tanpa libuv, Anda berdiri di konter dan bertanya "Apakah makanan saya sudah siap?" setiap sepuluh detik. Anda menghambat antrean.
Dengan libuv, Anda memesan, duduk, dan menunggu notifikasi. Anda bebas melakukan hal lain sampai pizzanya siap.
Ringkasan:
• Eksekusi JavaScript: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv
libuv adalah mesin yang membuat Node.js tetap cepat.
