Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una API devuelve 429 Too Many Requests cuando tu aplicación ha enviado más solicitudes de las que la API permite en un período de tiempo. La propia solicitud está bien. Lo enviaste con demasiada frecuencia, por lo que la API la rechazó. Si espera y lo envía de nuevo, normalmente funciona. La respuesta suele incluir un Retry-After encabezado que indica cuánto tiempo se debe esperar. Para obtener más información, consulte RFC 6585, sección 4.
Aspecto de 429 en las API más populares
Cada API implementa los límites de tasa de forma diferente. El código de estado, los encabezados y el cuerpo del error varían, por lo que el código que controla una API correctamente puede controlar incorrectamente el siguiente.
| API | Status | Cómo saber cuánto tiempo se debe esperar | Cuidado con |
|---|---|---|---|
| GitHub |
403 o 429 |
retry-after si está presente; en caso contrario, x-ratelimit-reset (segundos desde la época UTC) cuando x-ratelimit-remaining sea 0; en caso contrario, al menos 1 minuto |
Un 403 puede ser un límite de tasa o un permiso que falta. Lea los encabezados para distinguirlos. |
| OpenAI | 429 |
retry-after |
Algunos 429, como credit_balance_exhausted, significan que el reintento no ayudará. Compruebe error.code. |
| Antrópica | 429 |
retry-after |
Un límite de gasto 429 no tiene retry-after y sigue fallando hasta que se reanuda el acceso. Una API sobrecargada devuelve 529, no 429. |
| Microsoft Graph | 429 |
Retry-After (segundos) |
Los límites difieren por servicio, por ejemplo, SharePoint y Outlook. |
Cómo gestionar un error 429
- Decida si desea volver a intentarlo. Si el error indica que la cuota, los créditos o el límite de gasto se ha agotado, el reintento no ayudará. Dile al usuario y avísate.
- Espere tanto tiempo como lo solicite la API. Si la respuesta tiene
Retry-After, espere ese tiempo. Es un número de segundos o una fecha HTTP. Si la API usa encabezados de limitación de tasa en su lugar, como GitHubx-ratelimit-reset, espere hasta la hora de restablecimiento. - De lo contrario, retroceda. Sin una sugerencia de la API, vuelva a intentarlo con retroceso exponencial y aleatorización aleatoria, y detenga después de algunos intentos.
- Indique al usuario lo que está sucediendo. "Ocupado, reintentar en 5 segundos" supera a un indicador de carga que nunca termina.
- Ralentice antes del próximo 429. Si la API envía encabezados de límite de solicitudes, use el recuento restante para regular el ritmo de las solicitudes.
async function fetchWithRetry(url, options, attempts = 3) {
for (let attempt = 1; ; attempt++) {
const response = await fetch(url, options);
if (response.status !== 429 || attempt === attempts) {
return response;
}
const retryAfter = response.headers.get('retry-after');
const waitMs = retryAfter
? (isNaN(retryAfter) ? new Date(retryAfter) - Date.now() : retryAfter * 1000)
: 2 ** attempt * 1000 + Math.random() * 1000;
await new Promise(resolve => setTimeout(resolve, Math.max(waitMs, 0)));
}
}
Muchos SDK reintentan por ti las solicitudes que reciben respuestas 429. Por ejemplo, openAI Python SDK reintenta dos veces de forma predeterminada y el controlador estándar de resiliencia de .NET reintenta 3 veces y respeta Retry-After. Cuando el SDK se queda sin reintentos, tu código recibe el error, por lo que todavía necesita un plan.
Cómo probar que la aplicación controla el código de estado HTTP 429
Rara vez ves un 429 mientras desarrollas. La API es rápida, usted es el único usuario y los datos de prueba son pequeños. Por lo tanto, la forma de probar la gestión del 429 decide si encuentra los errores antes de que tus usuarios lo hagan.
| Approach | Lo que encuentras | Lo que te pierdes |
|---|---|---|
| Esperar a que esté en producción | Fallos reales | Todo, hasta que un usuario haga clic en ello |
| Simula la API en tus pruebas o deja que tu agente de codificación escriba el mock | Si se ejecuta la rama de reintento | Los códigos de estado real, los encabezados y los cuerpos de error de la API y la directiva de reintento de tu SDK. La aplicación también necesita una opción solo para pruebas para llegar al mock. |
| Llame a la API real hasta que te aplique limitación de tasa. | Comportamiento real | No se puede desencadenar un 429 a petición y se usa la cuota real. |
| Intercepte el tráfico real de la aplicación y devuelva 429s a petición | Direcciones URL reales, el SDK real y la directiva de reintento, y el formato 429 de la API | Nada en tu aplicación cambia, por lo que no prueba tu código de forma aislada. Reserve las pruebas unitarias para eso. |
Pruébalo en tu aplicación
Dev Proxy intercepta las solicitudes de la aplicación a las API que elijas y devuelve 429s, con los encabezados y el formato de error de la API, mientras que la aplicación sigue llamando a las direcciones URL reales. También indica cuándo la aplicación vuelve a intentarlo antes de que Retry-After se acabe el tiempo.
Descargue el preajuste de la API a la que llama la aplicación e inicie Dev Proxy con él:
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
| API | Preset |
|---|---|
| GitHub | github-rate-limiting |
| OpenAI | openai-throttling |
| Anthropic | anthropic-throttling |
Microsoft Graph (OneDrive y SharePoint: /drive, /shares, /sites) |
microsoft-graph-rate-limiting |
A continuación, ejecute la aplicación como de costumbre y observe lo que hace. Para instalar Dev Proxy, consulte Configurar Dev Proxy.