Mga error sa rate limit

Huling na-update: 3 buwan ang nakalipas

Kung makikita mo ang 429 Too Many Requests, ibig sabihin ay masyadong madalas mong tinatamaan ang API. Narito kung paano ito haharapin nang tama.

Ang error

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

Bakit nangyayari ito

Pinoprotektahan ng mga rate limit ang API laban sa labis na paggamit:

  • Napakaraming request sa maikling panahon

  • Agresibong pagpo-poll o pag-scrape

  • Walang pagkaantala sa pagitan ng mga request

  • Mga sabayang request nang walang throttling

Exponential backoff na estratehiya

Ang pinakamainam na paraan para harapin ang mga rate limit ay ang exponential backoff—maghintay nang mas matagal pagkatapos ng bawat 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');
}

Pag-iwas sa rate limits

Magdagdag ng mga pagkaantala sa pagitan ng mga request:

// Bad: Rapid-fire requests
for (const id of mediaIds) {
  await api.getResource(id); // No delay
}
// Good: Throttled requests
for (const id of mediaIds) {
  await api.getResource(id);
  await sleep(500); // 500ms delay
}

I-batch ang mga operasyon:

// Proseso sa mga batch na 10 na may mga pagkaantala
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 sa pagitan ng mga batch
  }
}

I-cache ang mga tugon:

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

Ano ang HINDI dapat gawin

  • ❌ I-retry agad nang walang pagkaantala

  • ❌ Gumawa ng mga sabayang request nang walang limit

  • ❌ Balewalain ang mga 429 error

  • ❌ Gumamit ng nakapirming maiikling pagkaantala (laging gumamit ng exponential backoff)

Kung magpapatuloy ang mga problema

Makipag-ugnayan sa developer support kung lehitimo mong kailangan ng mas mataas na rate limit para sa iyong use case. Magbigay ng mga detalye tungkol sa:

  • Ang iyong application at use case

  • Inaasahang dami ng request

  • Kasalukuyang implementasyon (na may backoff)

Nakatulong ba ang artikulong ito?