Bloglara Dön

ÖFÖ ile Node.js Uygulamanızı Hızlandırın

ÖFÖ
25/10/2026
73 görüntülenme
```html

ÖFÖ ile Node.js Uygulamanızı Hızlandırın: Performans Sorunlarını 7 Adımda Çözün

Node.js tabanlı uygulamanızın yavaş çalışması, her saniye binlerce lira gelir kaybına neden olabilir. Kullanıcılarınızın 3 saniye bekleme süresi sonrasında %53'ü sitenizi terk ediyor. E-ticaret platformunuzda, SaaS uygulamanızda veya API servislerinizde yaşanan performans sorunları, doğrudan cironuza ve marka itibarınıza zarar veriyor. Peki bu sorunları kalıcı olarak çözmek için ne yapıyorsunuz?

ÖFÖ ekibi olarak, son 5 yılda 200+ Node.js projesinde karşılaştığımız performans darboğazlarını ve bunların çözüm yöntemlerini sizinle paylaşıyoruz. Bu rehberde, işletmenizin Node.js altyapısını nasıl optimize edeceğinizi ve ÖFÖ ile çalışarak bu süreci nasıl hızlandırabileceğinizi adım adım öğreneceksiniz.

1. Performans Tespiti: Sorunu Doğru Tanımlamak

Çözümün ilk adımı, sorunun kaynağını tespit etmektir. Node.js uygulamalarında yavaşlık genellikle:

  • Veritabanı sorgularındaki gecikmeler (N+1 sorgu problemi, eksik indexler)
  • Event loop blokajları (CPU-intensive işlemler)
  • Hatalı caching stratejileri veya caching eksikliği
  • Memory leak'ler ve düşük bellek yönetimi

ÖFÖ.dev hizmetleri kapsamında sunduğumuz siber güvenlik taraması ve penetrasyon testleri, sadece güvenlik açıklarını değil, performans zayıflıklarını da ortaya çıkarır. New Relic, PM2 Monitoring ve özel geliştirdiğimiz APM araçlarıyla uygulamanızı 72 saat boyunca analiz ediyoruz ve size detaylı bir rapor sunuyoruz.

2. Veritabanı Optimizasyonu: MySQL ve MongoDB'de Hız Katlamak

Node.js uygulamalarının %70'inde performans sorunu, veritabanı katmanından kaynaklanır. ÖFÖ'nun uzman mühendisleri, MySQL ve MongoDB veritabanı yönetimi konusunda derinlemesine tecrübeye sahiptir.

MySQL Optimizasyonu:

// Kötü Performans: N+1 Sorgu Problemi
const users = await db.query('SELECT * FROM users');
for (let user of users) {
  user.orders = await db.query('SELECT * FROM orders WHERE user_id = ?', [user.id]);
}

// İyi Performans: JOIN ile Tek Sorgu
const users = await db.query(`
  SELECT u.*, JSON_ARRAYAGG(o.*) as orders 
  FROM users u 
  LEFT JOIN orders o ON u.id = o.user_id 
  GROUP BY u.id
`);

ÖFÖ ile çalışarak, veritabanı bağlantı havuzlarınızı (connection pooling) optimize ediyor, eksik index'leri belirliyor ve sorgu performansınızı %300'e varan oranlarda iyileştiriyoruz. Ayrıca, read replicas ve sharding stratejileriyle ölçeklenebilirliğinizi artırıyoruz.

MongoDB Optimizasyonu:

// Index Oluşturma: 5 Saniyeden 50 Milisaniyeye Düşüş
db.users.createIndex({ "email": 1 }, { unique: true })
db.orders.createIndex({ "userId": 1, "createdAt": -1 })

// Aggregation Pipeline Optimizasyonu
const optimizedPipeline = [
  { $match: { status: "active" } },
  { $lookup: { from: "users", localField: "userId", foreignField: "_id", as: "user" } },
  { $unwind: "$user" },
  { $project: { "user.password": 0 } }
];

3. Caching Stratejileri: Redis ile Yanıt Süresini 10x Azaltmak

Her isteği veritabanına yollamak, hem maliyet hem de performans açısından intihardır. ÖFÖ.dev olarak projelerimizde Redis tabanlı multi-layer caching mimarisi kuruyoruz.

const redis = require('redis');
const client = redis.createClient();

// Cache-Aside Pattern
async function getUserProfile(userId) {
  const cacheKey = `user:${userId}`;
  
  // Önce cache'te ara
  const cached = await client.get(cacheKey);
  if (cached) return JSON.parse(cached);
  
  // Cache'te yoksa veritabanından çek
  const user = await db.query('SELECT * FROM users WHERE id = ?', [userId]);
  
  // Cache'e yaz (TTL: 5 dakika)
  await client.setEx(cacheKey, 300, JSON.stringify(user));
  
  return user;
}

// Cache invalidation stratejisi
async function updateUser(userId, data) {
  await db.query('UPDATE users SET ? WHERE id = ?', [data, userId]);
  await client.del(`user:${userId}`); // Cache temizleme
}

ÖFÖ ekibi, sadece Redis kurulumunu değil, cache warming, cache-aside ve write-through stratejilerinin tam entegrasyonunu sağlar. Bu sayede API yanıt sürelerinizi 2000ms'den 150ms'ye düşürebiliriz.

4. Event Loop Yönetimi: CPU-Intensive İşlemleri Ayrıştırmak

Node.js single-threaded yapısı nedeniyle, uzun süren işlemler tüm uygulamayı kilitleyebilir. ÖFÖ'nun önerdiği çözüm:

const { Worker } = require('worker_threads');

// Ana thread'i bloklamayan işlem
function processLargeCSV(filePath) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./csv-processor.js', { workerData: filePath });
    
    worker.on('message', resolve);
    worker.on('error', reject);
    worker.on('exit', (code) => {
      if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`));
    });
  });
}

// csv-processor.js (Worker Thread)
const { workerData, parentPort } = require('worker_threads');
const fs = require('fs');

const data = fs.readFileSync(workerData, 'utf8');
const processed = data.split('\n').map(line => line.toUpperCase());
parentPort.postMessage(processed);

ÖFÖ ile çalışarak, uzun süren şifreleme işlemlerini, büyük dosya işlemlerini ve karmaşık hesaplamaları worker thread'lere veya microservice'lere taşıyoruz. Bu sayanda ana uygulamanızın yanıt süresi korunur.

5. Clustering ve Load Balancing: PM2 ile Ölçeklendirme

Single Node.js instance, tek bir CPU core'u kullanır. Ancak modern sunucular 16-32 core'a sahip. ÖFÖ.dev hizmetleri kapsamında PM2 clustering kurulumunu otomatikleştiriyoruz.

// ecosystem.config.js
module.exports = {
  apps: [{
    name: "api-server",
    script: "./app.js",
    instances: "max", // Tüm CPU core'larını kullan
    exec_mode: "cluster",
    env: {
      NODE_ENV: "production",
      PORT: 3000
    },
    // Memory limit: 1GB (memory leak durumunda otomatik restart)
    max_memory_restart: "1G",
    // Log yönetimi
    log_file: "./logs/combined.log",
    error_file: "./logs/error.log"
  }]
};

// Load Balancer (Nginx konfigürasyonu)
/*
upstream nodejs_backend {
    least_conn;
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
    server 127.0.0.1:3003;
}
*/

ÖFÖ ekibi, PM2 clustering'i sadece kurmakla kalmaz, zero-downtime deployment, health checks ve auto-scaling konfigürasyonlarını da yapar. 10.000+ eşzamanlı bağlantıyı sorunsuz karşılayabilirsiniz.

6. Memory Leak Tespiti ve Garbage Collection Optimizasyonu

Bellek sızıntıları, Node.js uygulamalarınızı zaman içinde yavaşlatır ve sonunda çökmesine neden olur. ÖFÖ'nun izleme araçları ile bu sorunları proaktif tespit ediyoruz.

// Memory leak örneği: Event listener'lar temizlenmiyor
class UserService {
  constructor() {
    this.users = new Map();
    // HATALI: Event listener temizlenmiyor
    eventEmitter.on('userUpdate', this.handleUpdate.bind(this));
  }
  
  // DOĞRU: Remove listener when object destroyed
  cleanup() {
    eventEmitter.removeListener('userUpdate', this.handleUpdate.bind(this));
  }
}

// Memory usage monitoring
setInterval(() => {
  const usage = process.memoryUsage();
  if (usage.heapUsed > 500 * 1024 * 1024) { // 500MB threshold
    console.error('Memory warning! Restarting...');
    process.exit(1); // PM2 otomatik restart edecek
  }
}, 30000);

ÖFÖ.dev hizmetleri arasında, memory profiling ve heap dump analizi bulunmaktadır. Uygulamanızın bellek kullanımını 48 saat boyunca izleyerek leak kaynaklarını tespit eder ve optimize ederiz.

7. API Rate Limiting ve Gzip Compression

Performans sadece hız değil, aynı zamanda kaynak yönetimidir. ÖFÖ'nun önerdiği middleware çözümleri:

const rateLimit = require('express-rate-limit');
const compression = require('compression');

// Rate limiting: DDoS ve abuse koruması
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 dakika
  max: 100, // 15 dakikada 100 istek
  message: 'Çok fazla istek gönderildi. Lütfen daha sonra tekr            
#öfö #ofo.dev #node.js #performance #optimization #node.js #backend #javascript