
Node.js, asenkron (asynchronous) ve olay tabanlı (event-driven) yapısıyla bilinir ve modern, yüksek performanslı arka uç (back-end) uygulamalarının ve API’lerin (Uygulama Programlama Arayüzü) bel kemiğidir. Milyonlarca isteği (request) aynı anda işleyebilme potansiyeline sahip olsa da, varsayılan ayarları genellikle maksimum verimlilik için optimize edilmemiştir. Basit bir API’nin performansını %40'a varan oranlarda artırmak, çoğu zaman karmaşık kod değişikliklerinden ziyade, doğru çalışma zamanı (runtime) ayarlarını yapmakla mümkündür.
Deneyimli bir web geliştirme uzmanı ve editör olarak, Node.js üzerinde çalışan API’lerinizin hızını ve kapasitesini önemli ölçüde artıracak, ancak çoğu geliştiricinin gözden kaçırdığı o nadide ayarları ve teknik optimizasyonları inceliyoruz.
1. V8 Motoru Optimizasyonları: Performansın Kalbi
Node.js'in performansının temeli, JavaScript kodunu makine diline çeviren Google V8 motorudur. V8 motorunun çalışma şeklini etkileyen bazı nadir komut satırı (command line) bayrakları (flags) performansı doğrudan artırır.a. Bellek Sınırını Genişletmek (–max-old-space-size)
Node.js, varsayılan olarak 32-bit mimariyi taklit eden bir bellek (RAM) sınırına sahiptir. Yüksek trafikli API'ler veya büyük veri setleriyle çalışan uygulamalar, bu sınıra hızla ulaşabilir ve Çöp Toplayıcı (Garbage Collector - GC) sürekli çalışarak performansı düşürür.
Performansı artırmak için, uygulamanın çalıştırıldığı sunucunun fiziksel RAM'ine uygun bir sınır belirlemek kritiktir:
Bash
node --max-old-space-size=4096 server.js
Bu ayar (4096 MB), özellikle API'nin yoğun ön uç isteklerini işlerken gereksiz GC duraklamalarını (pauses) azaltır, böylece gecikme (latency) süresini düşürür.
b. Gelişmiş Çöp Toplama Algoritmaları (–optimize-for-size ve –no-lazy-sweeping)
Varsayılan GC ayarları genel kullanıma uygundur, ancak bazı bayraklar performansa odaklanır:- –optimize-for-size'ı Kaldırmak: Geliştiriciler bazen bellek kullanımını azaltmak için bu bayrağı kullanır, ancak bu, performansı ciddi şekilde yavaşlatabilir. Performans öncelikli API’lerde bu ayardan kaçınılmalıdır.
- –no-lazy-sweeping: Bu, V8'in GC döngülerini daha agresif ve hızlı yapmasını sağlayarak, uygulamanın bellek temizleme işlemini daha çabuk bitirmesine ve işleme geri dönmesine olanak tanır.
2. Ağ ve I/O (Giriş/Çıkış) Optimizasyonları
Node.js, olay döngüsü (event loop) sayesinde verimli bir I/O yönetimine sahiptir, ancak ağ protokol katmanındaki ince ayarlar, HTTP/3 gibi yeni standartların getirdiği hızı tam olarak kullanmaya yardımcı olabilir.
a. keep-alive Süresini Yönetmek
API'lerdeki performans düşüşünün yaygın nedenlerinden biri, her istek (request) için yeni bir TCP/IP bağlantısı kurulmasıdır. HTTP/1.1 ve HTTP/2, keep-alive başlığını kullanarak bu bağlantıları bir süre açık tutar, böylece aynı istemci için birden fazla istekte bağlantı yeniden kurulumu gerekmez.
Express.js gibi çerçevelerde (frameworks), server.keepAliveTimeout varsayılandan daha yüksek bir değere ayarlanmalıdır (örneğin 5 saniyeden 60 saniyeye):
JavaScript
server.keepAliveTimeout = 60 * 1000; // 60 saniye
server.headersTimeout = 65 * 1000; // Keep-alive süresinden biraz uzun olmalı
Bu ayar, özellikle tekil istemcilerden (örneğin mobil uygulamalardan) sürekli istek alan API'lerin gecikmesini azaltmada kritik rol oynar.
b. Kümeleme (Clustering) ile Çekirdek Kullanımını Artırma
Node.js, tek iş parçacıklı (single-threaded) bir yapıdadır. Sunucudaki diğer CPU (işlemci) çekirdeklerini kullanmak için Node.js Küme (Cluster) modülü kullanılmalıdır. Bu, tek bir Node.js uygulamasının birden fazla örneğini aynı anda çalıştırarak iş yükünü tüm çekirdeklere dağıtır.
Maksimum Performans∝CPU C¸ekirdeg˘i Sayısı×Uygulama O¨rnek Sayısı
Bu basit ayarlama, API'nin eşzamanlı istek işleme kapasitesini sunucunun çekirdek sayısıyla doğru orantılı olarak artırır.
3. Güvenlik ve Performans Dengesi
API'nin hızını artırırken güvenliği göz ardı etmemek gerekir. Front-End Güvenliği yazımızda belirttiğimiz gibi, kullanıcıdan gelen her şey tehlikelidir ve bu yükü sunucudan kaldırmak performansı artırır.
a. Gzip/Brotli Sıkıştırmayı Doğru Kullanmak
Yanıt (response) boyutlarını küçültmek, ağ trafiğini azaltır ve API performansını artırır. Çoğu geliştirici Gzip kullanır, ancak tarayıcılar ve modern sunucular tarafından desteklenen Brotli sıkıştırması, genellikle %15-20 daha iyi sıkıştırma oranı sunar.
- Sıkıştırma, trafiği azaltır, ancak sunucu üzerindeki CPU yükünü artırır. Yüksek trafikli API’lerde, sıkıştırmayı doğrudan Node.js sunucusunda yapmak yerine, bir Ters Proxy (Reverse Proxy) (örneğin Nginx veya Caddy) üzerinde yapmak daha verimli olabilir.
b. Kritik İş Yüklerini Arka Plan İşlemlerine Taşımak
API, kullanıcının beklemediği uzun süreli işlemleri (örneğin e-posta gönderme, büyük veri işleme veya PDF oluşturma) olay döngüsünden çıkarıp, iş kuyruklarına (job queues) (Redis, RabbitMQ vb.) devretmelidir. Bu, Olay Döngüsü'nün tıkanmasını (blocking) önler ve anlık API yanıt sürelerini (response times) hızlandırır.
Sonuç: Varsayılan Ayarları Sorgulayın
Node.js, kutudan çıktığı haliyle güçlüdür, ancak üst düzey performans için bir miktar ince ayar gereklidir. Bu nadir V8 bayrakları, ağ ayarları ve mimari kararlar, API'nizin potansiyelini serbest bırakır. API performansını %40 artırmak, sadece yeni kod yazmakla değil, mevcut sistemin derinlemesine optimizasyonunu yapmakla mümkündür.
Unutulmamalıdır ki, her performans ayarı sunucunun donanımına ve uygulamanın iş yüküne göre değişir. Bu ayarları yaparken mutlaka yük testleri (load testing) yaparak etkinliği doğrulanmalıdır.


