Kısa Cevap: Node.js ile çok sayıda paralel API isteğini yönetmek için akış kontrolü sağlayan kütüphaneler (örneğin `p-limit` veya `bottleneck`) kullanmak en etkili yöntemdir. Bu kütüphaneler, eşzamanlı istek sayısını sınırlayarak API limitlerine takılmayı önler ve
hata yönetimini kolaylaştırır.
Node.js ortamında binlerce harici API isteğini paralel ve verimli bir şekilde yönetmek, gerçekten de dikkatli bir planlama ve doğru araçların kullanımını gerektirir. `Promise.all` ile tüm istekleri aynı anda tetiklemek, genellikle hem kendi sunucunuzu yormak hem de hedef API'nin limitlerine takılmak anlamına gelir. Bu durumu aşmak için 'concurrency control' yani eşzamanlılık kontrolü mekanizmaları kullanmak esastır.
Bu tür senaryolarda `p-limit` veya `bottleneck` gibi kütüphaneler devreye girer. Bu kütüphaneler, eşzamanlı olarak çalışabilecek maksimum işlem sayısını belirlemenize olanak tanır. Böylece, bir yandan paralel işlemin getirdiği hızı korurken, diğer yandan API sağlayıcının belirlediği istek limitlerinin üzerinde bir yük oluşturmazsınız. Bu, aynı zamanda kendi sunucunuzun kaynaklarını da daha dengeli kullanmanızı sağlar.
Const pLimit = require('p-limit');
const axios = require('axios');
// Eşzamanlı çalışacak maksimum işlem sayısını belirle (örneğin 10)
const limit = pLimit(10);
async function fetchData(url) {
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error(`Veri çekme hatası: ${url}, Hata: ${error.message}`);
// Hata durumunda yeniden deneme veya özel bir değer döndürme
return null;
}
}
async function processAllData(urls) {
const input = urls.map(url => limit(() => fetchData(url)));
const results = await Promise.all(input);
console.log('Tüm veriler çekildi.');
return results.filter(Boolean); // Hatalı olanları filtrele
}
// Örnek kullanım
const apiUrls = [
'https://api.example.com/data/1',
'https://api.example.com/data/2',
// ... binlerce URL
'https://api.example.com/data/N'
];
processAllData(apiUrls).then(data => {
console.log('İşlenmiş veri adedi:', data.length);
});
Yukarıdaki `p-limit` örneğinde, `limit` fonksiyonu bir sarmalayıcı (wrapper) görevi görür ve `fetchData` çağrılarını belirli bir eşzamanlılık sınırı dahilinde çalıştırır. Her `fetchData` çağrısı, `limit` tarafından yönetilen bir kuyruğa alınır ve ancak bir önceki işlem tamamlandığında yeni bir işlem başlatılır. Bu yaklaşım, hem API limitlerine takılma olasılığını azaltır hem de kendi sunucunuzun bellek ve CPU kullanımını daha kontrol edilebilir hale getirir.
Hata yönetimi tarafında ise her bir API isteği için `try-catch` blokları kullanmak, başarısız olan isteklerin tüm süreci durdurmasını engeller. Başarısız istekler için yeniden deneme (retry) mekanizmaları uygulamak da performansı artırabilir. Exponential Backoff stratejisi ile yeniden denemeler yapmak, API sunucusuna aşırı yük bindirmeden ve kademeli bir bekleme süresiyle başarılı olma şansını artırır.
Son olarak, API sağlayıcısının rate limit detaylarını dikkatlice incelemek, eşzamanlılık limitinizi belirlerken size en doğru bilgiyi sağlayacaktır. Bazı API'ler dakikada X istek, bazıları saniyede Y istek veya belirli bir IP adresinden Z istek gibi farklı kısıtlamalar uygulayabilir. Bu limitlere uygun bir `p-limit` değeri seçmek, entegrasyonunuzun sorunsuz çalışması için kritik bir adımdır.