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.
GitHub limita el número de solicitudes de API REST que puede enviar tu aplicación. Cuando se supera un límite, GitHub rechaza tus solicitudes con un estado 403 o 429 hasta que se restablezca el límite o transcurra el tiempo de espera. GitHub tiene dos tipos de límites: un límite principal en las solicitudes por hora y los límites secundarios que protegen contra las ráfagas. Si tu aplicación sigue enviando solicitudes mientras está sujeta a la limitación de tasa, GitHub podría bloquear tu integración. Para más información, consulte Límites de tasa para la API REST.
Cómo son las limitaciones de tasa de GitHub
| Limit | Value | Cuando se supera el límite |
|---|---|---|
| Primario, sin autenticar | 60 solicitudes por hora, por dirección IP |
403 o 429, y x-ratelimit-remaining es 0 |
| Token de acceso personal principal | 5000 solicitudes por hora | Igual que en el caso anterior |
Primario, GITHUB_TOKEN en Acciones de GitHub |
1000 solicitudes por hora, por repositorio | Igual que en el caso anterior |
| Secundaria | Por ejemplo, no más de 100 solicitudes simultáneas, 900 puntos por minuto para los puntos de conexión REST y aproximadamente 80 solicitudes de generación de contenido por minuto |
403 o 429 con un mensaje de error.
retry-after podría estar presente. |
GitHub puede cambiar los límites secundarios sin previo aviso y no hay ninguna manera de comprobar lo cerca que estás de alcanzarlos.
Cada respuesta incluye encabezados que indican cuál es su situación respecto del límite principal:
| Header | Lo que te dice |
|---|---|
x-ratelimit-limit |
El número máximo de solicitudes que puedes enviar por hora |
x-ratelimit-remaining |
Cuántas solicitudes le quedan en la ventana actual |
x-ratelimit-used |
Cuántas solicitudes has enviado en la ventana actual |
x-ratelimit-reset |
Cuando se restablece la ventana, en segundos de época UTC |
x-ratelimit-resource |
A qué límite se ha contabilizado la solicitud |
Cómo administrar un límite de frecuencia de GitHub
- Distinguir un límite de frecuencia de un error de permiso. GitHub también devuelve
403cuando el token no tiene acceso. Si la respuesta no tieneretry-after,x-ratelimit-remainingno es0y el mensaje no menciona un límite de peticiones, se trata de un problema de permisos. No vuelvas a intentarlo. - Siga
retry-afterprimero. Si el encabezado está presente, espere esa cantidad de segundos. - De lo contrario, espere al reinicio. Si
x-ratelimit-remaininges0, no vuelva a intentarlo hasta el momento enx-ratelimit-reset. - De lo contrario, espere al menos 1 minuto. En el caso de un límite secundario sin ninguno de los dos encabezados, GitHub te pide que esperes al menos 1 minuto y que esperes más tiempo tras cada reintento fallido. Detenga después de un número establecido de reintentos y genere un error.
-
Ralentice antes de que se agote. Use
x-ratelimit-remainingyx-ratelimit-resetpara dosificar sus solicitudes. No cree lógica en torno a un recuento restante exacto, ya que GitHub puede cambiar los límites. Losx-ratelimit-*encabezados son la fuente de referencia, no elGET /rate_limitendpoint.
async function githubWaitMs(response, attempt) {
if (response.status !== 403 && response.status !== 429) {
return null;
}
const retryAfter = response.headers.get('retry-after');
if (retryAfter) {
return Number(retryAfter) * 1000;
}
if (response.headers.get('x-ratelimit-remaining') === '0') {
const resetMs = Number(response.headers.get('x-ratelimit-reset')) * 1000;
return Math.max(resetMs - Date.now(), 0);
}
const { message = '' } = await response.clone().json().catch(() => ({}));
if (response.status === 429 || /rate limit/i.test(message)) {
return 60_000 * 2 ** attempt;
}
// A 403 without rate limit signals is a permission problem: don't retry
return null;
}
El código que llama vuelve a intentarlo cuando la función devuelve un número y se detiene después de algunos intentos.
Cómo probar que la aplicación controla los límites de tasa de GitHub
Rara vez alcanzas un límite de tasa de GitHub mientras desarrollas. Envías algunas solicitudes y 5.000 por hora parecen infinitas. Por lo tanto, la forma de probar la gestión de la limitación de tasa determina si encuentras los errores antes de que tus usuarios lo hagan.
| Approach | Lo que encuentras | Lo que te pierdes |
|---|---|---|
| A la espera de la producción | Fallos reales | Todo ello, hasta que un usuario lo alcance. |
| Simula la API en tus pruebas o deja que tu agente de programación escriba la simulación | Si se ejecuta tu rama de reintentos. | Los encabezados reales y los cuerpos de error de GitHub, y la directiva de reintento de tu SDK. La aplicación también necesita una opción solo para pruebas para llegar al mock. |
| Llama a la API real hasta que te limite. | Comportamiento real | Acepta hasta 5.000 solicitudes, no puedes activar un límite secundario a voluntad y corres el riesgo de que se bloquee tu integración. |
| Intercepta el tráfico real de tu aplicación y devuelve respuestas de límite de tasa a voluntad | Direcciones URL reales, el SDK real y la directiva de reintento, y los propios encabezados de GitHub y el formato de error | Nada en la aplicación cambia, por lo que no prueba el código de forma aislada. Mantenga las pruebas unitarias para eso. |
Pruébalo en tu app
Dev Proxy intercepta las solicitudes de tu aplicación a api.github.com y devuelve respuestas de limitación de tasa al estilo de GitHub, mientras tu aplicación sigue llamando a las URL reales. El github-rate-limiting preajuste cuenta tus solicitudes con respecto a un límite de 60 por hora, envía los encabezados x-ratelimit-* y devuelve un 429 con API rate limit exceeded cuando se agota el límite. Hasta entonces, tus solicitudes se envían a GitHub y también cuentan para tu límite real.
Descargue el preajuste e inicie Dev Proxy con él:
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
Para probar los límites secundarios, inicie Dev Proxy con devproxyrc-secondary.json desde la misma carpeta en su lugar. Devuelve aleatoriamente un límite 429 de tasa secundario con la cabecera retry-after.
A continuación, ejecute la aplicación como de costumbre y observe lo que hace. Para instalar Dev Proxy, consulte Configurar Dev Proxy.