Encabezado Retry-After: cuánto tiempo debe esperar antes de volver a intentarlo

Retry-After es un encabezado de respuesta HTTP que indica a la aplicación cuánto tiempo debe esperar antes de enviar la siguiente solicitud. El valor es un número de segundos o una fecha HTTP. Cuando una API lo envía, es la respuesta más fiable a ¿cuándo puedo volver a intentarlo?, ya que procede del servidor que rechazó tu solicitud. Para obtener más información, vea RFC 9110, sección 10.2.3.

Qué aspecto tiene Retry-After

El encabezado tiene dos formatos. Tu aplicación debe administrar ambas situaciones.

Formato Example Qué significa
Seconds Retry-After: 120 Espere 120 segundos (2 minutos) desde que recibió la respuesta. El valor es un número entero no negativo.
Fecha HTTP Retry-After: Fri, 31 Dec 1999 23:59:59 GMT No envíes la solicitud de nuevo antes de que transcurra este tiempo. La fecha siempre está en GMT.

Los servidores envían Retry-After con estos códigos de estado:

Status ¿Qué Retry-After significa? Source
429 Too Many Requests Cuánto tiempo debe esperar antes de enviar una nueva solicitud. El servidor puede incluirlo. RFC 6585, sección 4
503 Service Unavailable Cuánto tiempo se espera que el servicio no esté disponible. El servidor puede incluirlo. RFC 9110, sección 15.6.4
413 Content Too Large Si la condición es temporal, el servidor debe indicar después de cuánto tiempo terminará. RFC 9110, sección 15.5.14
Cualquier redireccionamiento 3xx Tiempo mínimo de espera antes de seguir la redirección. RFC 9110, sección 10.2.3

El encabezado es opcional. Algunas APIs usan sus propias cabeceras en su lugar. Por ejemplo, GitHub indica cuándo se restablece el límite con x-ratelimit-reset. Para obtener más información, consulta Límite de frecuencia de la API de GitHub superado.

Cómo controlar Retry-After

  1. Lee ambos formatos. Si el valor es un número, se mide en segundos. De lo contrario, analízalo como una fecha y resta la hora actual. Si la fecha ya está en el pasado, puede volver a intentarlo de inmediato.
  2. Espere al menos el tiempo que indique el encabezado. Si lo intentas antes de tiempo, normalmente obtendrás otro 429 o 503. Algunas API siguen contando las solicitudes mientras te limitan la tasa, por lo que los reintentos tempranos pueden hacer que la espera sea más larga. Por ejemplo, consulta Guía de limitación de Microsoft Graph.
  3. Recurre a la estrategia de retroceso con fluctuación cuando falte el encabezado. Duplica el tiempo de espera después de cada intento fallido, añade una cantidad aleatoria para que muchos clientes no vuelvan a intentarlo al mismo tiempo y limita el tiempo de espera máximo.
  4. Limita tus reintentos. Tras varios intentos, devuelve el error al solicitante.
  5. Compruebe que un reintento puede ayudar. Algunas API devuelven 429 cuando se agotan tus créditos o se alcanza tu límite de gasto. Esperar no arreglará eso. Para obtener un ejemplo, vea OpenAI insufficient_quota y credit_balance_exhausted.
function retryDelayMs(response, attempt) {
  const value = response.headers.get('retry-after');
  if (value) {
    const seconds = Number(value);
    const ms = Number.isNaN(seconds) ? Date.parse(value) - Date.now() : seconds * 1000;
    if (!Number.isNaN(ms)) {
      return Math.max(ms, 0);
    }
  }
  // No usable header: exponential backoff with jitter, capped at 30 seconds
  return Math.random() * Math.min(30_000, 1_000 * 2 ** attempt);
}

Muchos SDK administran Retry-After por ti, pero solo hasta que se agoten los reintentos. Entonces, tu código recibe el error.

SDK Lo que hace de forma predeterminada
Manejador de resiliencia estándar de .NET Reintenta las respuestas 408, 429 y 5xx hasta 3 veces con retroceso exponencial y fluctuación. Utiliza Retry-After para el retraso porque ShouldRetryAfterHeader tiene como valor predeterminado true.
SDK de Microsoft Graph Úselo Retry-After cuando esté presente y vuelva a la espera exponencial cuando no lo esté. Las solicitudes dentro de un lote JSON no se reintentan automáticamente.
SDK de Python de OpenAI Vuelve a intentar los errores de conexión y las respuestas 408, 409, 429 y 5xx dos veces con un retroceso exponencial corto. Establece max_retries para cambiarlo.

Consulta la documentación de tu SDK para conocer la directiva exacta y comprueba qué ocurre cuando falla el último reintento.

Cómo probar que la aplicación controla Retry-After

Rara vez tienes un Retry-After mientras desarrollas y, cuando lo tienes, no puedes controlar su valor. Por lo tanto, la forma en que pruebes esto determinará si detectas los errores antes que tus usuarios.

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 tu código analiza el encabezado Si tu cliente HTTP real o tu SDK esperan el tiempo suficiente, y qué envía realmente la API. 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 el tráfico Comportamiento real No puedes provocar una respuesta limitada a demanda, y agotas tu cuota real
Intercepta el tráfico real de tu aplicación y devuelve respuestas limitadas a demanda Si tu SDK real y tu directiva de reintentos esperan tanto tiempo como indica el encabezado 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 las API que elijas y devuelve 429 respuestas con un encabezado Retry-After, mientras tu aplicación sigue llamando a las URL reales. El RetryAfterPlugin recuerda cuándo se puede reintentar cada solicitud limitada. Si la aplicación llama a la misma dirección URL antes de ese momento, Dev Proxy lo notifica y limita la solicitud de nuevo. El complemento realiza un seguimiento únicamente de las 429 respuestas.

En tu archivo de errores para el GenericRandomErrorPlugin, establece el Retry-After valor de una 429 respuesta en @dynamic, y Dev Proxy completará el número de segundos y lo controlará por ti.

Para probarlo, descarga una configuración preestablecida que utilice ambos complementos e inicia Dev Proxy con ella:

devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"

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