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ı
- timers: süresi dolmuş
setTimeout/setIntervalcallback'leri - pending callbacks: bir önceki turdan ertelenen bazı sistem callback'leri (ör. TCP hataları)
- idle, prepare: iç kullanım
- poll: yeni I/O olaylarını alır ve callback'lerini çalıştırır; yapılacak iş yoksa burada bekler
- check:
setImmediatecallback'leri - 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.
İlgili Node.js soruları
- cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?
- Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?
- process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?
- Express.js'te middleware nedir ve nasıl çalışır?
- CommonJS ile ES Modules (ESM) arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.