Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?

Cevap

Node.js JavaScript'i tek bir thread'de çalıştırır, ama I/O işlemlerini engellemeden (non-blocking) yürütür. Bunu, C ile yazılmış libuv kütüphanesi sağlar.

libuv ne yapar?

  • Ağ I/O'su için işletim sisteminin asenkron mekanizmalarını kullanır (Linux'ta epoll, macOS'ta kqueue, Windows'ta IOCP). Burada ek thread gerekmez.
  • İşletim sisteminin asenkron desteği olmayan işleri thread pool'da yürütür (varsayılan 4 thread, UV_THREADPOOL_SIZE): dosya sistemi (fs), dns.lookup, crypto.pbkdf2, zlib.
  • İş bitince callback'i event loop'un ilgili kuyruğuna koyar.

Event loop aşamaları

  1. timers: süresi dolmuş setTimeout / setInterval callback'leri
  2. pending callbacks: bir önceki turdan ertelenen bazı sistem callback'leri (ör. TCP hataları)
  3. idle, prepare: iç kullanım
  4. poll: yeni I/O olaylarını alır ve callback'lerini çalıştırır; yapılacak iş yoksa burada bekler
  5. check: setImmediate callback'leri
  6. close callbacks: socket.on("close") gibi kapanış callback'leri

Her callback'ten sonra process.nextTick kuyruğu, ardından Promise microtask kuyruğu tamamen boşaltılır.

Pratik sonuç: event loop'u bloklamayın

Tek thread olduğu için uzun süren senkron bir işlem tüm istekleri durdurur:

app.get("/rapor", (req, res) => {
  const sonuc = agirHesap();   // 2 saniye CPU: bu sürede hiçbir istek yanıtlanmaz
  res.json(sonuc);
});

Bloklayan örnekler: büyük JSON.parse/stringify, senkron fs.*Sync çağrıları, crypto.pbkdf2Sync, felaketsel backtracking yapan regex (ReDoS), büyük dizilerde yoğun döngüler.

Çözümler: işi parçalara bölmek, worker_threads, iş kuyruğu (BullMQ) ile ayrı worker'lara taşımak.

Teşhis

perf_hooks.monitorEventLoopDelay() ile event loop gecikmesi ölçülür; clinic.js veya --cpu-prof ile bloklayan fonksiyon bulunur.

  1. cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?ZorNode.jsBackend
  2. Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?OrtaNode.jsBackend
  3. Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?OrtaNode.jsBackend
  4. process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?OrtaNode.jsBackend
  5. Express.js'te middleware nedir ve nasıl çalışır?KolayNode.jsBackend
  6. CommonJS ile ES Modules (ESM) arasındaki fark nedir?KolayNode.jsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle