Bagaimana Node.js Mengendalikan Beribu-ribu Permintaan

Ramai orang mengatakan Node.js adalah single-threaded.

Namun, ia mengendalikan beribu-ribu permintaan, membaca fail, dan membuat panggilan API tanpa henti.

Bagaimana ia berfungsi?

Jawapannya ialah libuv.

libuv ialah sebuah perpustakaan C. Ia memberikan Node.js keupayaan I/O asinkronus dan non-blocking. JavaScript tidak boleh membaca fail atau menguruskan soket rangkaian dengan sendirinya. Node.js menggunakan libuv untuk berkomunikasi dengan sistem operasi anda.

Tanpa libuv, JavaScript akan terhenti setiap kali anda membaca fail. Aplikasi anda akan menjadi tidak responsif.

Dengan libuv, pembacaan fail berlaku di latar belakang. JavaScript terus menjalankan kod yang lain.

Contoh:

console.log("Start");

fs.readFile("data.txt", "utf8", (err, data) => {
  console.log(data);
});

console.log("End");

Output: Start End (file contents)

Node.js mencetak "End" sebelum fail selesai dibaca. Ia tidak menunggu.

Bagaimana libuv menguruskan kod anda:

• The Event Loop: libuv menjalankan gelung (loop) yang menyemak jika tugasan telah selesai. Ia meletakkan callback dalam barisan (queue) apabila tugasan selesai. • Thread Pool: JavaScript menggunakan satu thread. libuv menggunakan sekumpulan worker threads. Secara lalai, kumpulan ini mempunyai 4 thread. Thread ini mengendalikan tugasan berat seperti:

  • Operasi sistem fail
  • Carian DNS
  • Pemampatan
  • Kriptografi • Networking: libuv menguruskan soket HTTP, TCP, dan UDP. Ini membolehkan pelayan mengendalikan banyak sambungan secara serentak. • Timers: libuv mengendalikan setTimeout dan setInterval.

Aliran pelaksanaan berfungsi seperti ini:

  1. JavaScript menjalankan kod anda.
  2. libuv membawa tugasan berat ke latar belakang.
  3. JavaScript meneruskan ke baris seterusnya.
  4. libuv memaklumkan Event Loop apabila tugasan selesai.
  5. Event Loop menjalankan callback anda.

Bayangkan sebuah kedai piza.

Tanpa libuv, anda berdiri di kaunter dan bertanya "Adakah makanan saya sudah siap?" setiap sepuluh saat. Anda menghalang barisan.

Dengan libuv, anda membuat pesanan, duduk, dan menunggu notifikasi. Anda bebas melakukan perkara lain sehingga piza siap.

Ringkasan:

• Pelaksanaan JavaScript: V8 Engine • Event Loop: libuv • I/O Fail: libuv • Rangkaian: libuv • Timers: libuv

libuv ialah enjin yang memastikan Node.js kekal pantas.

Sumber: https://dev.to/kavindotdev/understanding-libuv-the-engine-behind-nodejs-asynchronous-programming-3n7o