Ana içeriğe geç

Node.js Clustering ile Ölçeklendirme: Cluster ve PM2 Rehberi

Bu Rehberde Ne Öğreneceksiniz?

Bu rehberde Node.js’in tek çekirdek sınırını aşmayı öğreneceksiniz.
Uygulamanızı tüm CPU çekirdeklerini kullanacak şekilde ölçeklendireceğiz.
Cluster ve PM2 farkını yük testiyle net biçimde göreceksiniz.


🧠 Teknik Özet

Ana konu: Node.js uygulamalarında clustering
Problem: Tek süreçli Node.js uygulamalarının CPU darboğazı
Çözüm: Cluster modülü ve PM2 ile çoklu süreç kullanımı
Adımlar:

  1. Tek süreçli uygulama
  2. Cluster ile ölçekleme
  3. Yük testi
  4. PM2 ile production yapı

Neden Node.js Clustering Gerekli?

Node.js varsayılan olarak tek çekirdek kullanır.
CPU yoğun işlemler performansı ciddi düşürür.
Yoğun trafikte tek süreç kolayca tıkanır.

Cluster, aynı uygulamayı birden fazla süreçle çalıştırır.
Yük çekirdekler arasında dengelenir.
Bir süreç düşerse diğerleri hizmete devam eder.


Ön Gereksinimler

  • En az 4 çekirdekli bir sunucu
  • Node.js ve npm kurulu bir sistem
  • Temel Express.js bilgisi
  • Terminal kullanımı

1️⃣ Proje Ortamını Hazırlama

mkdir rabisu-cluster-demo
cd rabisu-cluster-demo
npm init -y
  • Bu komut yeni bir Node.js projesi oluşturur.

package.json dosyasına ES module desteği ekleyin:

"type": "module"

2️⃣ Gerekli Paketleri Kurma

npm install express
npm install -g loadtest pm2
  • Express sunucu kurar, loadtest yük testi yapar, PM2 süreç yönetir.

3️⃣ Cluster Olmadan Uygulama Oluşturma

import express from "express";

const port = 3000;
const app = express();

console.log(`Worker PID: ${process.pid}`);

app.get("/yuksek-islem", (req, res) => {
let toplam = 0;
for (let i = 0; i < 5_000_000; i++) {
toplam++;
}
res.send(`İşlem sonucu: $&#123;toplam&#125;\n`);
});

app.listen(port, () => {
console.log(`$&#123;port&#125; portunda dinleniyor`);
});
  • Bu endpoint CPU’yu bilinçli şekilde yorar.

Çalıştırın:

node index.js

4️⃣ Cluster Modülü ile Ölçeklendirme

import cluster from "cluster";
import os from "os";
import &#123; dirname &#125; from "path";
import &#123; fileURLToPath &#125; from "url";

const __dirname = dirname(fileURLToPath(import.meta.url));
const cpuSayisi = os.cpus().length;

console.log(`CPU Sayısı: $&#123;cpuSayisi&#125;`);
console.log(`Primary PID: ${process.pid}`);

cluster.setupPrimary({
exec: __dirname + "/index.js",
});

for (let i = 0; i < cpuSayisi; i++) {
cluster.fork();
}

cluster.on("exit", (worker) => {
console.log(`Worker ${worker.process.pid} düştü, yenisi başlatılıyor`);
cluster.fork();
});
  • Bu yapı her çekirdek için bir worker başlatır.


5️⃣ Performans Karşılaştırması

  1. 🔹 Cluster Olmadan
loadtest -n 1200 -c 200 -k http://localhost:3000/yuksek-islem
  • Tahmini sonuç:

~80–90 istek/saniye

  • Yüksek gecikme
  1. 🔹 Cluster ile
  • Aynı komutu tekrar çalıştırın.

Tahmini sonuç:

~300–350 istek/saniye

  • Gecikme ciddi düşer

6️⃣ PM2 ile Production Ölçeklendirme

pm2 start index.js -i 0

-i 0 tüm CPU çekirdeklerini kullanır.


Durumu kontrol edin:

pm2 ls

Logları izleyin:

pm2 logs

❓ Sıkça Sorulan Sorular

  1. Node.js neden tek çekirdek kullanır? Event-driven yapısı CPU yerine G/Ç odaklıdır.

  2. Cluster bellek tüketimini artırır mı? Evet, her worker ayrı bir süreçtir.

  3. Worker’lar veri paylaşabilir mi? Hayır. Redis gibi harici çözümler gerekir.

  4. Production için hangisi önerilir? PM2 daha pratiktir.


Sonuç

Bu rehberde Node.js uygulamalarını ölçeklendirmeyi öğrendiniz. Cluster ile CPU gücünü verimli kullandınız. PM2 ile production ortamına hazır hale geldiniz.

🚀 Rabisu Bulut çok çekirdekli VDS altyapısında bu yapıyı hemen test edebilirsiniz. Yük artarken performans düşmesin.