1. Async/Await Kullanımı ile Kod Temizliği ve Hızlandırma
Örneğin, aşağıdaki gibi bir kod yapısı ile, callback yerine `async/await` kullanarak, işlemlerinizi daha düzgün bir şekilde sıralayabilirsiniz:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error fetching data: ', error);
}
}
Yukarıdaki kodda, `async/await` kullanarak, veri çekme işlemini bekleyerek senkron gibi çalıştırdık. Bu yöntem, özellikle I/O işlemlerinde büyük bir hız kazancı sağlar.
2. Promise.all ve Paralel İşlemler: Hangi Durumlarda Kullanılır?
Örneğin, üç farklı API'den veri çekmeniz gerektiğinde, her biri için bir `Promise` oluşturup, `Promise.all` ile bu işlemleri paralel olarak çalıştırabilirsiniz:
async function fetchMultipleData() {
try {
const [data1, data2, data3] = await Promise.all([
fetch('https://api.example1.com').then(res => res.json()),
fetch('https://api.example2.com').then(res => res.json()),
fetch('https://api.example3.com').then(res => res.json())
]);
console.log(data1, data2, data3);
} catch (error) {
console.error('Error fetching data: ', error);
}
}
Bu kodda, üç API çağrısı paralel olarak yapılır ve hepsi bitmeden önce hiçbir işlem beklemez. Bu, performans açısından büyük bir iyileştirme sağlar.
3. Cluster Modu ile Yük Dengeleme ve Çok Çekirdekli Performans Artışı
Cluster modunu etkinleştirerek, her bir çekirdek için ayrı bir iş parçacığı (worker) oluşturabilir ve yükü bu worker’lara dağıtarak daha hızlı ve verimli bir işlem yapabilirsiniz:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Master process
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
// Worker processes have a HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello, Node.js!');
}).listen(8000);
}
Bu yöntemle, işlemci gücünüzü tam anlamıyla kullanarak, Node.js'in performansını ciddi şekilde artırabilirsiniz.
4. Event Loop ve Non-Blocking I/O: Anlamadığınız Bir Konu mu?
Örneğin, veritabanı sorguları, dosya okuma/yazma işlemleri veya HTTP istekleri gibi I/O işlemleri sırasında Node.js, diğer kodları çalıştırmaya devam eder.
5. Memory Leak Analizi ve Optimasyonu
6. Mikroservis Mimarisi ile Dağıtık Sistemlerde Performans İyileştirmeleri
7. Cache Kullanımı: Redis veya Memcached ile Node.js Hızlandırma
const redis = require('redis');
const client = redis.createClient();
client.set('user:1', JSON.stringify({ name: 'John' }), redis.print);
client.get('user:1', (err, reply) => {
console.log(JSON.parse(reply));
});
Yukarıdaki örnekte, Redis kullanarak, veriyi bellekte tutuyoruz ve her seferinde veritabanına erişmek yerine bu veriyi hızlıca alıyoruz.
Sonuç
Umarım bu ipuçları, Node.js uygulamalarınızı daha hızlı ve verimli hale getirmek konusunda size yardımcı olur.