Límite de peticiones de la API de GitHub superado: lo que significa y cómo gestionarlo

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

  1. Distinguir un límite de frecuencia de un error de permiso. GitHub también devuelve 403 cuando el token no tiene acceso. Si la respuesta no tiene retry-after, x-ratelimit-remaining no es 0 y el mensaje no menciona un límite de peticiones, se trata de un problema de permisos. No vuelvas a intentarlo.
  2. Siga retry-after primero. Si el encabezado está presente, espere esa cantidad de segundos.
  3. De lo contrario, espere al reinicio. Si x-ratelimit-remaining es 0, no vuelva a intentarlo hasta el momento en x-ratelimit-reset.
  4. 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.
  5. Ralentice antes de que se agote. Use x-ratelimit-remaining y x-ratelimit-reset para dosificar sus solicitudes. No cree lógica en torno a un recuento restante exacto, ya que GitHub puede cambiar los límites. Los x-ratelimit-* encabezados son la fuente de referencia, no el GET /rate_limit endpoint.
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.

Pasos siguientes

Consulte también