Estrategias de reintento
La API responde con códigos transitorios (429, 5xx) y permanentes (4xx salvo 429). Solo conviene reintentar los transitorios y los errores de red, siempre con backoff exponencial y jitter.
Decisión rápida
function shouldRetry(err) {
if (!err.response) return true; // network error
const status = err.response.status;
if (status === 429) return true;
if (status >= 500 && status < 600) return true;
return false;
}Backoff exponencial con jitter
const backoffMs = (intento) => {
const base = Math.min(1000 * Math.pow(2, intento), 30000);
const jitter = Math.random() * 1000;
return base + jitter;
};Patrón completo
async function callWithRetry(fn, maxRetries = 5) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (err) {
if (!shouldRetry(err) || i === maxRetries - 1) throw err;
// Si hay Retry-After, respétalo
const retryAfter = err.response?.headers['retry-after'];
const waitMs = retryAfter ? parseInt(retryAfter) * 1000 : backoffMs(i);
await sleep(waitMs);
}
}
}