cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
Cevap
Bir Node.js süreci JavaScript'i tek çekirdekte çalıştırır. Birden çok çekirdeği kullanmanın iki yerleşik yolu vardır.
cluster
Aynı uygulamanın birden çok ayrı sürecini (process) başlatır. Hepsi aynı portu paylaşır; ana süreç gelen bağlantıları worker'lara dağıtır (Linux'ta varsayılan round-robin).
import cluster from "node:cluster";
import os from "node:os";
import http from "node:http";
if (cluster.isPrimary) {
for (let i = 0; i < os.availableParallelism(); i++) cluster.fork();
cluster.on("exit", () => cluster.fork()); // çöken worker'ı yenile
} else {
http.createServer((req, res) => res.end(`pid ${process.pid}`)).listen(3000);
}worker_threads
Aynı süreç içinde ayrı thread'ler açar. Her thread'in kendi V8 isolate'i ve event loop'u vardır; veri postMessage ile kopyalanarak, ya da SharedArrayBuffer ile paylaşılarak aktarılır.
import { Worker } from "node:worker_threads";
function hashHesapla(veri) {
return new Promise((resolve, reject) => {
const w = new Worker("./hash-worker.js", { workerData: veri });
w.once("message", resolve);
w.once("error", reject);
});
}Karşılaştırma
| cluster | worker_threads | |
|---|---|---|
| Birim | Ayrı süreç | Aynı süreçte thread |
| Bellek | Her süreç ayrı, yüksek | Daha düşük, paylaşım mümkün |
| İzolasyon | Tam: biri çökerse diğerleri yaşar | Kısmi |
| İletişim | IPC (yavaş, serialize) | postMessage, SharedArrayBuffer |
| Amaç | HTTP throughput'unu çekirdeklere yaymak | CPU-yoğun işi ana thread'den almak |
Ne zaman hangisi?
- cluster: I/O ağırlıklı bir web sunucusunu tüm çekirdeklere yaymak. Ancak container ortamında genelde cluster yerine Kubernetes'te birden çok pod/replica çalıştırmak ve PM2 gibi araçlar tercih edilir.
- worker_threads: görüntü işleme, PDF üretimi, büyük JSON dönüşümü, şifreleme gibi CPU-bound işler. Her istekte yeni Worker açmak pahalıdır; worker pool (ör.
piscina) kullanın.
Her iki durumda da süreçler/thread'ler bellek paylaşmadığından session ve cache gibi durumlar Redis gibi harici bir yerde tutulmalıdır.
İlgili Node.js soruları
- Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?
- 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.