Rate limit-fouten

Laatst bijgewerkt: 3 maanden geleden

Als je ziet 429 Too Many Requests, dan ben je de API te vaak aan het aanroepen. Zo kun je dit correct afhandelen.

De fout

HTTP 429 Too Many Requests
{
  "error": "Limit exceed."
}

Waarom dit gebeurt

Rate limits beschermen de API tegen overmatig gebruik:

  • Te veel verzoeken in een korte tijd

  • Aggressief pollen of scrapen

  • Geen wachttijd tussen verzoeken

  • Gelijktijdige verzoeken zonder throttling

Strategie met exponentiële backoff

De beste manier om rate limits af te handelen is exponentiële backoff: wacht langer na elke retry:

async function fetchWithBackoff(url, options, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await fetch(url, options);
      
      if (response.status === 429) {
        const waitTime = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s, 8s, 16s
        console.log(`Rate limited. Waiting ${waitTime}ms before retry ${attempt + 1}/${maxRetries}`);
        
        await new Promise(resolve => setTimeout(resolve, waitTime));
        continue;
      }
      
      if (!response.ok) {
        throw new Error(`HTTP ${response.status}`);
      }
      
      return await response.json();
      
    } catch (error) {
      if (attempt === maxRetries - 1) throw error;
    }
  }
  
  throw new Error('Max retries exceeded');
}

Rate limits voorkomen

Voeg wachttijden toe tussen verzoeken:

// Slecht: verzoeken in een snelle stroom
for (const id of mediaIds) {
  await api.getResource(id); // Geen wachttijd
}
// Goed: throttled verzoeken
for (const id of mediaIds) {
  await api.getResource(id);
  await sleep(500); // 500ms wachttijd
}

Bundel je bewerkingen:

// Verwerk in batches van 10 met wachttijden
const batchSize = 10;
for (let i = 0; i < mediaIds.length; i += batchSize) {
  const batch = mediaIds.slice(i, i + batchSize);
  await Promise.all(batch.map(id => api.getResource(id)));
  
  if (i + batchSize < mediaIds.length) {
    await sleep(2000); // 2s tussen batches
  }
}

Cache de antwoorden:

const cache = new Map();
async function getCachedResource(mediaId) {
  if (cache.has(mediaId)) {
    return cache.get(mediaId);
  }
  
  const data = await api.getResource(mediaId);
  cache.set(mediaId, data);
  return data;
}

Wat je NIET moet doen

  • ❌ Meteen opnieuw proberen zonder wachttijd

  • ❌ Parallelle verzoeken doen zonder limiet

  • ❌ 429-fouten negeren

  • ❌ Vaste korte wachttijden gebruiken (gebruik altijd exponentiële backoff)

Als de problemen blijven

Neem contact op met developer support als je legitiem hogere rate limits nodig hebt voor je use case. Geef details over:

  • Je applicatie en use case

  • Verwachte hoeveelheid verzoeken

  • Huidige implementatie (met backoff)

Was dit artikel nuttig?