Erreurs de limitation de débit

Dernière mise à jour: il y a 3 mois

Si vous voyez 429 Too Many Requests, c’est que vous sollicitez l’API trop fréquemment. Voici comment le gérer correctement.

L’erreur

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

Pourquoi cela arrive

Les limites de débit protègent l’API contre une utilisation excessive :

  • Trop de requêtes en peu de temps

  • Interrogation fréquente ou scraping agressif

  • Absence de délai entre les requêtes

  • Requêtes concurrentes sans limitation (throttling)

Stratégie de backoff exponentiel

La meilleure façon de gérer les limites de débit est d’utiliser un backoff exponentiel : attendez plus longtemps après chaque nouvelle tentative :

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

Prévenir les limitations de débit

Ajoutez des délais entre les requêtes :

// Mauvais : requêtes en rafale
for (const id of mediaIds) {
  await api.getResource(id); // Pas de délai
}
// Bon : requêtes limitées
for (const id of mediaIds) {
  await api.getResource(id);
  await sleep(500); // Délai de 500ms
}

Traitez par lots :

// Traiter par lots de 10 avec des délais
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 entre les lots
  }
}

Mettre en cache les réponses :

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

Ce qu’il ne faut PAS faire

  • ❌ Réessayer immédiatement sans délai

  • ❌ Faire des requêtes en parallèle sans limite

  • ❌ Ignorer les erreurs 429

  • ❌ Utiliser des délais fixes et courts (utilisez toujours un backoff exponentiel)

Si les problèmes persistent

Contactez l’assistance développeurs si vous avez réellement besoin de limites de débit plus élevées pour votre cas d’usage. Indiquez :

  • Votre application et votre cas d’usage

  • Le volume de requêtes attendu

  • Votre implémentation actuelle (avec backoff)

Cet article vous a-t-il été utile ?