Node.js Binlerce İsteği Nasıl Yönetir

İnsanlar Node.js'in tek iş parçacıklı (single-threaded) olduğunu söyler.

Yine de duraksamadan binlerce isteği yönetir, dosyaları okur ve API çağrıları yapar.

Nasıl çalışır?

Cevap libuv.

libuv bir C kütüphanesidir. Node.js'e asenkron ve bloklamayan (non-blocking) I/O yetenekleri kazandırır. JavaScript kendi başına dosyaları okuyamaz veya ağ soketlerini yönetemez. Node.js, işletim sisteminizle iletişim kurmak için libuv'u kullanır.

libuv olmasaydı, her dosya okuduğunuzda JavaScript dururdu. Uygulamanız yanıt vermez hale gelirdi.

libuv ile dosya okuma işlemi arka planda gerçekleşir. JavaScript diğer kodları çalıştırmaya devam eder.

Örnek:

console.log("Start");

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

console.log("End");

Çıktı: Start End (dosya içeriği)

Node.js, dosya okuma işlemi bitmeden "End" yazdırır. Beklemez.

libuv kodunuzu nasıl yönetir:

• Event Loop: libuv, görevlerin tamamlanıp tamamlanmadığını kontrol eden döngüyü çalıştırır. Görevler tamamlandığında callback'leri bir kuyruğa ekler. • Thread Pool: JavaScript tek bir iş parçacığı kullanır. libuv ise bir işçi iş parçacığı havuzu (worker threads pool) kullanır. Varsayılan olarak bu havuz 4 iş parçacığına sahiptir. Bu iş parçacıkları şu gibi ağır görevleri yönetir:

  • Dosya sistemi işlemleri
  • DNS sorguları
  • Sıkıştırma
  • Kriptografi • Networking: libuv; HTTP, TCP ve UDP soketlerini yönetir. Bu, sunucuların aynı anda birçok bağlantıyı yönetmesine olanak tanır. • Timers: libuv, setTimeout ve setInterval işlemlerini yönetir.

Yürütme akışı şu şekilde çalışır:

  1. JavaScript kodunuzu çalıştırır.
  2. libuv ağır görevleri arka plana alır.
  3. JavaScript bir sonraki satıra geçer.
  4. Görev tamamlandığında libuv, Event Loop'u bilgilendirir.
  5. Event Loop, callback fonksiyonunuzu çalıştırır.

Bir pizza dükkanı düşünün.

libuv olmasaydı, tezgahın önünde durur ve her on saniyede bir "Yemeğim hazır mı?" diye sorardınız. Sırayı tıkardınız.

libuv ile siparişinizi verir, oturur ve bir bildirim beklerdiniz. Pizza hazır olana kadar diğer işlerinizi yapmaya devam edebilirsiniz.

Özet:

• JavaScript yürütme: V8 Engine • Event Loop: libuv • Dosya I/O: libuv • Ağ (Network): libuv • Zamanlayıcılar (Timers): libuv

libuv, Node.js'i hızlı tutan motordur.

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