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

clusterworker_threads
BirimAyrı süreçAynı süreçte thread
BellekHer süreç ayrı, yüksekDaha düşük, paylaşım mümkün
İzolasyonTam: biri çökerse diğerleri yaşarKısmi
İletişimIPC (yavaş, serialize)postMessage, SharedArrayBuffer
AmaçHTTP throughput'unu çekirdeklere yaymakCPU-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.

  1. Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?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