View a markdown version of this page

Comportamiento de los reintentos - AWS SDK y herramientas

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Comportamiento de los reintentos

importante

El comportamiento descrito en esta página requiere la suscripción hasta que se convierta en el comportamiento predeterminado. AWS_NEW_RETRIES_2026=trueConfigúralo en tu entorno. Sin esta configuración, el SDK utiliza el comportamiento de reintento anterior a 2026, que difiere en el tiempo de espera, los costos de la cuota de reintentos y los valores predeterminados específicos del servicio. Para obtener más información, consulta la entrada del blog del anuncio. https://aws.amazon.com/blogs/developer/announcing-updated-retry-behavior-for-aws-sdks-and-tools/

Cuando una solicitud a una persona Servicio de AWS falla debido a un error transitorio o a una limitación, el SDK puede volver a intentar la solicitud automáticamente. En esta página se explica cómo configurar los reintentos y cómo funcionan internamente.

  • Configurar los reintentos: Elija un modo de reintento, establezca el número máximo de intentos y comprenda la prioridad de la configuración.

  • Cómo funcionan los reintentos: El flujo de reintentos, la clasificación de errores, la fórmula de espera, la mecánica de las cuotas de reintentos y el comportamiento específico del servicio.

Configurar los reintentos

Tú controlas qué estrategia de reintento usa el SDK y cuántas veces lo hace.

Elegir un modo de reintento

El modo de reintento determina cómo se comporta el SDK cuando se produce un error en una solicitud. Hay tres modos disponibles: estándar, adaptativo y heredado.

Standard Flexible Legacy
Reintenta la cuota Sí Sí Varía según el SDK
Puede retrasar la solicitud inicial No Sí No
Error-type-specific retroceso Sí Sí Varía según el SDK
Estandarizado en todos los SDK Sí Sí No
Recomendación Predeterminado para todas las cargas de trabajo Single-resource, con grandes limitaciones, tolerante a la latencia Solo compatibilidad con versiones anteriores

Modo estándar (predeterminado)

El modo estándar reintenta las solicitudes fallidas mediante un retraso exponencial con fluctuación. Utiliza demoras más cortas para los errores transitorios (como los tiempos de espera de la red) y demoras más largas para los errores de limitación (por ejemplo). ThrottlingException

El modo estándar incluye una cuota de reintentos, un depósito de fichas que deduce las fichas por cada reintento y las repone cuando las solicitudes se realizan correctamente. Cuando se agotan los tokens disponibles, el SDK devuelve el error sin volver a intentarlo, por lo que la aplicación falla rápidamente en lugar de esperar a que pasen los reintentos que probablemente no tengan éxito. Esto también ayuda a que las interrupciones del servicio se resuelvan más rápido al reducir el tráfico de reintentos. Durante el funcionamiento normal, la cuota permanece llena y no tiene ningún efecto. La cuota de reintentos nunca retrasa ni bloquea la solicitud inicial. Solo se ven afectados los reintentos. Para obtener más información, consulte Cuota de reintentos (depósito de fichas).

Utilice el modo estándar a menos que tenga un motivo específico para elegir otro modo.

Modo adaptativo

El modo adaptativo incluye todo lo que hay en el modo estándar, además de un limitador de velocidad del lado del cliente. El limitador de velocidad rastrea las respuestas que limitan la velocidad y ajusta la velocidad a la que el SDK envía las solicitudes. A diferencia del modo estándar, el modo adaptativo puede retrasar o bloquear la solicitud inicial, no solo los reintentos, cuando se detecta una limitación.

El limitador de velocidad funciona por instancia de cliente del SDK. Todas las solicitudes de un cliente comparten el mismo límite de velocidad, independientemente de la operación de API o el recurso al que se dirijan.

Cuándo usar el modo adaptativo:

  • Su cliente se dirige a un solo recurso (por ejemplo, una tabla de DynamoDB) y espera respuestas de limitación frecuentes. Esto es habitual en los flujos de trabajo automatizados, los procesadores por lotes o las cargas de trabajo de IA que requieren una sola operación de API con un volumen elevado.

  • Quieres que el SDK se ralentice automáticamente cuando el servicio indique que hay una limitación.

Cuándo no usar el modo adaptativo:

  • Su cliente envía solicitudes a varios recursos o atiende a varios inquilinos. La limitación de un recurso hace que el limitador de velocidad ralentice todas las solicitudes de ese cliente, incluidas las solicitudes a los recursos no afectados.

  • Necesitas una latencia predecible en la solicitud inicial.

El modo adaptativo no se recomienda como opción predeterminada general.

Modo heredado

El modo heredado es el comportamiento de reintento que utilizaba cada SDK antes de que se introdujera el modo estándar. No incluye una cuota de reintentos estandarizada. Algunos SDK (como Java) tenían sus propias implementaciones de cuotas de reintentos en el modo antiguo, pero el comportamiento no es uniforme en todos los SDK. Sin una cuota estandarizada, un cliente continúa reintentándolo a toda velocidad durante las interrupciones del servicio. Esto bloquea los subprocesos y las conexiones de las solicitudes con pocas probabilidades de éxito, al tiempo que añade carga y puede retrasar la recuperación del servicio.

El modo heredado varía según los SDK. El recuento de reintentos, el tiempo de espera, los conjuntos de errores que se pueden volver a intentar y el comportamiento de limitación varían de un idioma a otro. El código que depende del comportamiento de reintento heredado puede comportarse de manera diferente cuando se mueve de un SDK a otro.

Disponible en: Java, Python, Ruby, PHP, C++ y CLI

No disponible en: .NET, Go, Kotlin, Rust, Swift, JavaScript

El modo Legacy existe por motivos de compatibilidad con versiones anteriores. Si actualmente usa el modo heredado, cambie al modo estándar.

Vuelva a intentar la configuración

La siguiente configuración controla el comportamiento de reintento. Puede configurarlos mediante variables de entorno, el archivo de configuración compartido (~/.aws/config) o la configuración del cliente en código.

Opción Qué controla Variable de entorno Clave del archivo de configuración Predeterminado
Modo de reintento Qué estrategia de reintento usar AWS_RETRY_MODE retry_mode standard
Máximo de intentos Total de intentos, incluida la solicitud inicial AWS_MAX_ATTEMPTS max_attempts 3(consulte las notas)

Un valor máximo de intentos 3 significa que el SDK realiza una solicitud inicial y hasta dos reintentos. Establezca el número máximo de intentos 1 para deshabilitar los reintentos por completo.

nota

Los clientes DynamoDB y DynamoDB Streams establecen de forma predeterminada el máximo de intentos. 4 Estos servicios utilizan un retraso de retroceso base más corto (25 ms en lugar de 50 ms) para adaptarse a su perfil de baja latencia. El intento adicional mantiene la demora máxima del último reintento, comparable a la de otros servicios. Puede anular esto con la misma configuración que se muestra en la tabla anterior.

Prioridad de configuración

Cuando especificas la misma configuración en varios lugares, el SDK resuelve el valor con la siguiente prioridad, de mayor a menor:

  1. Configuración de cliente explícita en el código. Un valor establecido directamente en el cliente SDK o en su objeto de configuración.

  2. Variable de entorno. Por ejemplo, AWS_RETRY_MODE o AWS_MAX_ATTEMPTS.

  3. Archivo de configuración compartido. La max_attempts tecla retry_mode o~/.aws/config.

  4. SDK predeterminado. El valor predeterminado integrado para la configuración.

Esto sigue la prioridad de configuración estándar del AWS SDK. Un valor establecido en un nivel superior siempre anula un valor establecido en un nivel inferior. Por ejemplo, si lo configuras AWS_RETRY_MODE=adaptive como variable de entorno y retry_mode=standard en~/.aws/config, el SDK usa el modo adaptativo.

Language-specific configuración

La configuración entre SDK que se describe en esta página (retry_modeymax_attempts) funciona en todos los SDK. Sin embargo, la API para configurar los reintentos en el código varía según el idioma. Consulta la guía para desarrolladores de tu SDK para ver las opciones de configuración específicas para cada idioma, como las estrategias de espera personalizadas, los errores adicionales al volver a intentarlo y el ajuste de las cuotas de reintentos.

Cómo funcionan los reintentos

En esta sección, se describe cómo AWS los SDK gestionan las solicitudes fallidas: qué errores provocan los reintentos, cuánto tiempo espera el SDK entre intentos y cuándo deja de intentarlo.

Qué ocurre cuando se produce un error en una solicitud

Cuando realizas una llamada a la API a través de un AWS SDK, el SDK sigue esta secuencia:

  1. Modo adaptativoSolo en modo adaptativo: el SDK comprueba el limitador de velocidad del lado del cliente. Si se detecta una limitación, el SDK puede retrasar o bloquear la solicitud antes de enviarla.

  2. El SDK envía la solicitud al punto final. Servicio de AWS

  3. Si el servicio devuelve una respuesta correcta, el SDK devuelve el resultado a tu código.

  4. Si la solicitud falla, el SDK clasifica el error como transitorio, limitado o que no se puede volver a intentar. Consulte ¿Qué errores se vuelven a intentar.

  5. Si el error no se puede volver a intentar, el SDK devuelve el error a tu código de inmediato. No se intenta volver a intentarlo.

  6. Si el error se puede volver a intentar, el SDK comprueba si se ha alcanzado el número máximo de intentos. Si es así, devuelve el error a tu código.

  7. El SDK comprueba elCuota de reintentos (depósito de fichas). Si el presupuesto del token se agota, el SDK no vuelve a intentarlo y devuelve el error a tu código. Excepción: en el Long-polling operaciones caso de que el SDK siga retrasando el proceso antes de devolver el error.

  8. El SDK calcula el retraso de espera en función del tipo de error y del número de reintentos. Consulte ¿Cuánto tiempo espera el SDK.

  9. El SDK espera el retraso calculado y, a continuación, vuelve a enviar la solicitud desde el paso 2.

El SDK repite este ciclo hasta que la solicitud se complete correctamente, se alcance el número máximo de intentos, se agote la cuota de reintentos o se produzca un error que no pueda volver a intentarlo. Todo el proceso es automático. Tu solicitud recibe una respuesta correcta o un error final.

¿Qué errores se vuelven a intentar

El SDK clasifica cada solicitud fallida en una de las tres categorías siguientes: transitoria, limitada o no reintentable. Esta clasificación determina si el SDK vuelve a intentar la solicitud y cuánto tiempo espera antes de volver a intentarlo.

La clasificación se basa en el código de error y el código de estado HTTP de la respuesta del servicio. Por ejemplo, un HTTP 400 con el código de error RequestTimeout se clasifica como transitorio y se vuelve a intentar. Un HTTP 400 con ValidationException se clasifica como no reintentable y se devuelve inmediatamente.

Clasificación de errores

Los errores transitorios se vuelven a intentar con un retraso base breve (50 ms):

Código de error
RequestTimeout
RequestTimeoutException
InternalError
IDPCommunicationError
I/O Fallo (restablecimiento de la conexión, error de resolución de DNS, tiempo de espera del socket)
(cualquier HTTP 500, 502, 503 o 504 sin un código de error reconocido)

Los errores de limitación se vuelven a intentar con un retraso base mayor (1000 ms):

Código de error
Throttling
ThrottlingException
ThrottledException
RequestThrottledException
TooManyRequestsException
ProvisionedThroughputExceededException
TransactionInProgressException
LimitExceededException
PriorRequestNotComplete
RequestThrottled
EC2ThrottledException
RequestLimitExceeded
SlowDown
BandwidthLimitExceeded

Non-retryable los errores (comoAccessDeniedException,ValidationException,ResourceNotFoundException) se devuelven a tu código inmediatamente.

nota

Un HTTP 5XX con un código de error de limitación se clasifica como error de limitación, no como error transitorio, aunque los errores 5XX suelen ser transitorios. El SDK busca primero el código de error y, a continuación, vuelve al código de estado HTTP.

Los errores de limitación significan que el servicio ha rechazado activamente tu solicitud debido a los límites de velocidad, por lo que el SDK espera más tiempo antes de volver a intentar darle tiempo al servicio para que recupere su capacidad. Consulta los retrasos específicos¿Cuánto tiempo espera el SDK.

¿Cuánto tiempo espera el SDK

El SDK utiliza un retroceso exponencial con una fluctuación total. De media, cada reintento espera más tiempo que el anterior, y se distribuye de forma aleatoria las solicitudes de varios clientes.

Base los retrasos por tipo de error

El retraso base depende de si el error es transitorio o limitante:

Tipo de error Retraso base Justificación
Transitorio (sin estrangulamiento) 50 ms Los errores transitorios normalmente se resuelven en milisegundos. Un retraso base corto permite una recuperación rápida.
Limitación 1000 ms El servicio ha limitado la velocidad de la solicitud. Un retraso base más prolongado da tiempo para recuperar la capacidad.

Fórmula Backoff

El SDK calcula cada retraso de reintento con esta fórmula:

delay = random(0, 1) × min(20,000 ms, base_delay × 2^retry)

Donde:

  • random(0, 1)devuelve un valor distribuido uniformemente entre 0 y 1

  • base_delayes de 50 ms para errores transitorios o 1000 ms para errores de limitación

  • retrycomienza en 0 para el primer reintento (el segundo intento total de solicitud)

El límite máximo de retroceso es de 20 segundos. Ningún retraso individual supera los 20 segundos, independientemente del número de intentos que se hayan realizado.

Ejemplos resueltos

Ejemplo 1: error transitorio, 3 intentos como máximo

Paso ¿Qué sucede? Delay
Intento 1 Solicitud inicial. El servicio devuelve HTTP 503. (ninguno)
Intento 2 El SDK espera de forma aleatoria (0, 50 ms). El reintento falla con 503. 0 a 50 ms (un promedio de ~25 ms)
Intento 3 El SDK espera de forma aleatoria (0, 100 ms). El reintento se realiza correctamente. De 0 a 100 ms (un promedio de ~ 50 ms)

La latencia total agregada promedia unos 75 ms en ambos reintentos.

Ejemplo 2: error de limitación, 3 intentos como máximo

Paso ¿Qué sucede? Delay
Intento 1 Solicitud inicial. El servicio devuelve 429Throttling. (ninguno)
Intento 2 El SDK espera de forma aleatoria (0, 1000 ms). El reintento devuelve 429. De 0 a 1000 ms (un promedio de aproximadamente 500 ms)
Intento 3 El SDK espera de forma aleatoria (0, 2000 ms). El reintento se realiza correctamente. De 0 a 2000 ms (un promedio de aproximadamente 1000 ms)

La latencia total agregada promedia alrededor de 1500 ms en ambos reintentos.

Ejemplo 3: error transitorio que alcanzó el límite de retroceso

Con un retraso base de 50 ms, el retraso calculado antes de la limitación sería:

Reintento Retraso máximo calculado Después de 20 s como máximo
1 50 ms 50 ms
2 100 ms 100 ms
5 800 ms 800 ms
9 12.800 ms 12.800 ms
10 25.600 ms 20 000 ms

El límite se aplica en el décimo intento (undécimo intento) para los errores transitorios. En el caso de los errores de limitación con una base de 1000 ms, el límite entra en vigor en el sexto intento.

nota

Con el valor predeterminado de 3 intentos como máximo (1 solicitud inicial más 2 reintentos), el límite de retroceso nunca se alcanza. En esta tabla se muestra lo que ocurre si aumentas con max_attempts creces el valor predeterminado.

Por qué es importante la fluctuación

El multiplicador aleatorio se denomina fluctuación completa. Sin él, todos los clientes que produzcan un error al mismo tiempo volverían a intentarlo al mismo tiempo, lo que generaría una ráfaga de tráfico de reintentos (el problema del «rebaño atronador»). Full Jitter distribuye los reintentos de manera uniforme durante todo el período de espera, de modo que el servicio recibe un flujo constante de solicitudes en lugar de picos sincronizados.

Por ejemplo, supongamos que 1000 clientes reciben todos un 503 al mismo tiempo. Full Jitter distribuye sus primeros reintentos de manera uniforme en un intervalo de 50 ms, en lugar de tener los 1000 reintentos exactamente a los 50 ms.

Server-directed temporización de reintentos

Algunas Servicios de AWS incluyen un x-amz-retry-after encabezado en las respuestas de error. El valor del encabezado es un retraso en milisegundos. Cuando este encabezado está presente, el SDK usa el retraso especificado por el servidor, fijado a un mínimo del retraso de retroceso calculado y a un máximo del retraso de retroceso calculado más 5000 ms. Dado que el retraso calculado en sí mismo tiene un límite de 20 segundos, el retraso máximo efectivo dirigido por el servidor es de 25 segundos. El SDK no aplica fluctuación a este valor porque se espera que el servicio lo altere. Esto permite que el servicio se comunique exactamente cuando espera tener capacidad disponible.

Cuota de reintentos (depósito de fichas)

El SDK mantiene un presupuesto interno de tokens que monitorea la proporción entre solicitudes exitosas y solicitudes fallidas. Cuando los errores son generalizados, el presupuesto se agota y el SDK devuelve los errores directamente. La aplicación falla rápidamente en lugar de esperar a reintentos que probablemente no tengan éxito. Esto también reduce el tráfico de reintentos, lo que ayuda a que las interrupciones del servicio se resuelvan más rápido.

Cómo funciona la cuota de reintentos

El presupuesto simbólico empieza lleno. Cada reintento deduce los tokens. Cuando un reintento se realiza correctamente, el SDK restaura los tokens consumidos por ese reintento. Cuando una solicitud se realiza correctamente en el primer intento (no es necesario volver a intentarlo), el SDK restaura 1 token. Cuando el presupuesto llega a cero, el SDK deja de reintentarlo y devuelve los errores directamente a tu código.

Parámetro Valor
Capacidad presupuestaria 500 fichas
Coste por reintento transitorio (sin limitación) 14 fichas
Coste por reintento de limitación 5 fichas
Los tokens se restauran tras un intento satisfactorio Cantidad consumida en el último intento (14 o 5)
Los tokens se restauran en caso de éxito sin volver a intentarlo 1 ficha

El mayor costo de los reintentos transitorios refleja su diferente patrón de fracaso. Los errores transitorios, como los 500, y las fallas de conexión suelen indicar un problema que afecta a todo el servicio. En estas situaciones, es poco probable que los reintentos continuos tengan éxito. Añade latencia a las llamadas, reduce los recursos de los clientes y puede retrasar la recuperación para todos. Los errores de limitación indican que el servicio necesita más tiempo antes de que la solicitud pueda realizarse correctamente. El SDK espera más tiempo entre los reintentos para aumentar las probabilidades de éxito.

¿Cuándo bloquea la cuota los reintentos

La cuota de reintentos registra los tokens en todo momento, pero solo bloquea los reintentos cuando se agota el presupuesto. Durante el funcionamiento normal, casi todas las solicitudes se realizan correctamente y el presupuesto permanece lleno. La cuota no tiene ningún efecto observable en los reintentos.

Un reintento exitoso solo restaura el costo de su propio token (14 o 5 tokens), no el costo de los reintentos fallidos anteriores en la misma solicitud. Por ejemplo, si el primer reintento falla y el segundo tiene éxito, el presupuesto pierde 14 fichas netas. El presupuesto se agota más rápido cuando los reintentos agotan todos los intentos sin éxito, pero también se agota gradualmente cuando las solicitudes necesitan varios reintentos antes de tener éxito.

Con el valor predeterminado de 3 intentos como máximo, la cuota comienza a agotarse cuando más de aproximadamente el 22% de las solicitudes dan lugar a errores transitorios sostenidos, o más de aproximadamente el 32% a errores de limitación. Por debajo de estas tasas, las solicitudes exitosas reponen el presupuesto más rápido de lo que los reintentos fallidos lo agotan.

El saldo inicial del presupuesto, de 500 fichas, proporciona un amortiguador que absorbe las ráfagas breves de errores. Un breve aumento de los errores, incluso si es grave, no bloquea los reintentos, a menos que se prolongue lo suficiente como para agotar el búfer.

Implicaciones prácticas

  • Bajos índices de fracaso: la cuota no tiene ningún efecto. El presupuesto se mantiene en su capacidad máxima o cerca de ella.

  • Durante una interrupción del servicio: si un porcentaje elevado de tus solicitudes fallan durante un período prolongado, la cuota se agota y tu cliente recibe los errores inmediatamente en lugar de esperar a que se repitan los intentos. Esto reduce la latencia del lado del cliente, libera subprocesos y conexiones y ayuda a que el servicio se recupere más rápido.

  • Recuperación: a medida que el servicio se recupera y las solicitudes vuelven a tener éxito, los reintentos realizados recuperan el coste total del token y los éxitos del primer intento restauran 1 token. El presupuesto se rellena gradualmente y los reintentos se reanudan automáticamente.

  • Alcance: el presupuesto del token normalmente se limita a una única instancia de cliente del SDK. El alcance exacto puede variar según el SDK. No se comparte entre procesos o hosts.

Service-specific comportamiento

DynamoDB

Los clientes de DynamoDB utilizan valores predeterminados ajustados y optimizados para el perfil de baja latencia de DynamoDB:

Opción Predeterminado general Valor predeterminado de DynamoDB
Retraso base transitorio (sin limitación) 50 ms 25 ms
Retraso base de aceleración 1000 ms 1000 ms
Máximo de intentos 3 4

Estos valores predeterminados se aplican tanto a Amazon DynamoDB como a DynamoDB Streams.

Long-polling operaciones

Algunas AWS operaciones utilizan sondeos prolongados. Pueden mantener una conexión abierta esperando a que llegue el trabajo. Estas operaciones reciben un tratamiento especial al volver a intentarlo:

  • SQS.ReceiveMessage

  • SFN.GetActivityTask

  • SWF.PollForActivityTask

  • SWF.PollForDecisionTask

Comportamiento especial: cuando se agota la cuota de reintentos y se bloquean los reintentos (paso 7 de la sección 7Qué ocurre cuando se produce un error en una solicitud), el SDK sigue retrasando el proceso antes de devolver el error al código.

Esto es importante porque las operaciones de sondeo prolongadas suelen ejecutarse en un bucle cerrado. Tu código llamaReceiveMessage, procesa los mensajes y ReceiveMessage vuelve a llamar inmediatamente. Sin el aplazamiento forzoso, un presupuesto de tokens agotado haría que el SDK devolviera errores sin demora. De este modo, el bucle de sondeo enviaría inmediatamente la siguiente solicitud, lo que aumentaría el uso de la CPU del cliente y generaría tráfico adicional. El retraso forzoso interrumpe este ciclo, lo que permite que el uso de los recursos del cliente y la tasa de sondeo sean manejables durante los fallos.

Soporte de AWS SDK y herramientas

En la tabla siguiente se muestra la disponibilidad del comportamiento de reintento actualizado en cada SDK. Para SDK-specific obtener más información, como la versión mínima, los valores predeterminados de antes y después y los ejemplos de código, consulta el tema del seguimiento. GitHub