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)