Rate-Limit-Fehler

Zuletzt aktualisiert: vor 3 Monaten

Wenn Sie 429 Too Many Requests sehen, rufen Sie die API zu häufig auf. So gehen Sie richtig damit um.

Der Fehler

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

Warum das passiert

Rate Limits schützen die API vor übermäßiger Nutzung:

  • Zu viele Anfragen in kurzer Zeit

  • Aggressives Polling oder Scraping

  • Keine Verzögerung zwischen Anfragen

  • Gleichzeitige Anfragen ohne Drosselung

Strategie mit exponentiellem Backoff

Der beste Weg, Rate Limits zu handhaben, ist exponentielles Backoff: Warten Sie nach jedem Retry länger:

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 vermeiden

Fügen Sie Verzögerungen zwischen Anfragen hinzu:

// Schlecht: Anfragen im Schnellfeuer
for (const id of mediaIds) {
  await api.getResource(id); // Keine Verzögerung
}
// Gut: Gedrosselte Anfragen
for (const id of mediaIds) {
  await api.getResource(id);
  await sleep(500); // 500ms Verzögerung
}

Verarbeiten Sie Vorgänge im Batch:

// In Batches von 10 verarbeiten, mit Verzögerungen
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 zwischen Batches
  }
}

Antworten cachen:

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;
}

Was Sie NICHT tun sollten

  • ❌ Sofort erneut versuchen, ohne Verzögerung

  • Parallele Anfragen ohne Begrenzung stellen

  • 429-Fehler ignorieren

  • Feste kurze Verzögerungen verwenden (immer exponentielles Backoff nutzen)

Wenn die Probleme weiterhin bestehen

Wenden Sie sich an den Developer Support, wenn Sie für Ihren Anwendungsfall berechtigt höhere Rate Limits benötigen. Geben Sie Details zu:

  • Ihrer Anwendung und Ihrem Use Case

  • Erwartetes Anfragevolumen

  • Aktuelle Implementierung (mit Backoff)

War dieser Artikel hilfreich?