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 activarlo hasta que se convierta en el comportamiento predeterminado. AWS_NEW_RETRIES_2026=trueConfigúrelo en su entorno. Sin esta configuración, el SDK utiliza un comportamiento de reintentos anterior a 2026, que difiere en cuanto al tiempo de espera, los costes de las cuotas de reintentos y los valores predeterminados específicos del servicio. Para obtener más información, consulta la entrada del blog sobre el anuncio.

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

  • Configuración de 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: Flujo de reintentos, clasificación de errores, fórmula de retroceso, mecánica de cuotas de reintentos y comportamiento específico del servicio.

Configuración de reintentos

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

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 tradicional.

Standard Flexible Legacy
Vuelva a intentar la cuota Varía según el SDK
Puede retrasar la solicitud inicial No No
Error-type-specific retraso Varía según el SDK
Estandarizado en todos los SDK No
Recomendación Predeterminado para todas las cargas de trabajo Single-resource, con alta regulación, 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 de fase. Utiliza retrasos más cortos para los errores transitorios (como los tiempos de espera de la red) y más largos 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 reabastece cuando las solicitudes se aceptan. 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 se repitan los intentos, que es poco probable que se realicen correctamente. 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 completa 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 (grupo 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 en el lado del cliente. El limitador de velocidad rastrea las respuestas de limitación 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 o el recurso de la API a los que se dirijan.

Cuándo usar el modo adaptativo:

  • Su cliente se dirige a un único recurso (por ejemplo, una tabla de DynamoDB) y espera recibir 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 invocan una sola operación de API con un volumen elevado.

  • Lo ideal es que el SDK se ralentice automáticamente cuando el servicio señale una limitación.

Cuándo no usar el modo adaptativo:

  • Su cliente envía solicitudes a varios recursos o atiende a varios inquilinos. Al limitar un recurso, el limitador de velocidad ralentiza todas las solicitudes de ese cliente, incluidas las solicitudes a los recursos no afectados.

  • Necesitas una latencia predecible en la solicitud inicial.

No se recomienda el modo adaptativo como predeterminado general.

Modo heredado

El modo heredado es el comportamiento de reintento que utilizaba cada SDK antes de la introducción del 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 tradicional, pero el comportamiento no es uniforme en todos los SDK. Sin una cuota estandarizada, el cliente sigue reintentándolo a toda velocidad durante las interrupciones del servicio. Esto bloquea los hilos y las conexiones de las solicitudes con pocas probabilidades de éxito y, al mismo tiempo, añade una carga que puede retrasar la recuperación del servicio.

El modo heredado varía según los SDK. El número 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 tradicional puede comportarse de forma diferente cuando se mueve de un SDK a otro.

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

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

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

Vuelva a intentar la configuración

Los siguientes ajustes controlan el comportamiento de los reintentos. 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
Número máximo de intentos Número total de intentos, incluida la solicitud inicial AWS_MAX_ATTEMPTS max_attempts 3(ver notas)

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

nota

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

Prioridad de configuración

Al especificar 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 del 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. Introduzca 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 estableces AWS_RETRY_MODE=adaptive como variable de entorno y dentro~/.aws/config, retry_mode=standard el SDK usa el modo adaptativo.

Language-specific configuración

La configuración de varios 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 del SDK para conocer las opciones de configuración específicas del idioma, como las estrategias de reducción personalizadas, los errores adicionales que se pueden volver a intentar y el ajuste de la cuota de reintentos.

Cómo funcionan los reintentos

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

¿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. Solo 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 se produce un error en la solicitud, el SDK clasifica el error como transitorio, limitado o no reintentable. Consulte ¿Qué errores se vuelven a intentar?.

  5. Si el error no se puede volver a intentar, el SDK lo devuelve al código inmediatamente. 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 (grupo de fichas). Si se agota el presupuesto del token, el SDK no lo vuelve a intentar y devuelve el error a tu código. Excepción: Long-polling operaciones el SDK sigue aplicando un retraso antes de devolver el error.

  8. El SDK calcula un retraso de espera en función del tipo de error y del número de intentos de reintento. 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 realice correctamente, se alcance el número máximo de intentos, se agote la cuota de reintentos o se produzca un error que no se pueda volver a intentar. Todo el proceso es automático. Su solicitud ve una respuesta correcta o un error final.

¿Qué errores se vuelven a intentar?

El SDK clasifica cada solicitud fallida en una de estas tres categorías: 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 corto (50 ms):

Código de error
RequestTimeout
RequestTimeoutException
InternalError
IDPCommunicationError
I/O Fallo (restablecimiento de la conexión, fallo en la resolución del 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 al código inmediatamente.

nota

Un código 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 coincide primero con el código de error y, a continuación, recurre 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 la capacidad. Consulta los retrasos ¿Cuánto tiempo espera el SDK específicos.

¿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 la distribución aleatoria permite distribuir las solicitudes de varios clientes.

Retrasos básicos por tipo de error

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

Tipo de error Retardo base Justificación
Transitorio (sin regulación) 50 ms Los errores transitorios suelen resolverse en milisegundos. Un retraso base corto proporciona una recuperación rápida.
Limitación 1000 ms El servicio tiene una tarifa limitada para la solicitud. Un retraso base mayor permite recuperar la capacidad.

Fórmula de retroceso

El SDK calcula cada retraso de reintento mediante 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 50 ms para errores transitorios o 1000 ms para errores de regulación

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

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

Ejemplos resueltos

Ejemplo 1: error transitorio, máximo 3 intentos

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

La latencia total agregada tiene un promedio de 75 ms en ambos reintentos.

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

Paso ¿Qué sucede? Delay
Intento 1 Solicitud inicial. El servicio devuelve 429Throttling. (ninguno)
Intento 2 El SDK espera aleatoriamente (0, 1000 ms). Al volver a intentarlo, se devuelve 429. 0—1000 ms (promedio ~ 500 ms)
Intento 3 El SDK espera aleatoriamente (0, 2000 ms). El reintento se realiza correctamente. 0—2000 ms (promedio ~ 1000 ms)

La latencia total agregada tiene un promedio de unos 1500 ms en ambos reintentos.

Ejemplo 3: Error transitorio, al alcanzar el límite de espera

Con un retraso base de 50 ms, el retraso calculado antes del límite sería:

Inténtelo de nuevo Retraso máximo calculado Después de un límite de 20 s
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 entra en vigor al décimo reintento (undécimo intento) en el caso de errores transitorios. En el caso de los errores de aceleración con una base de 1000 ms, el límite entra en vigor al 6º reintento.

nota

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

¿Por qué es importante la fluctuación

El multiplicador aleatorio se denomina fluctuación total. Sin él, todos los clientes que detecten 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 de la «manada a rabiar»). La fluctuación total distribuye los reintentos de manera uniforme en toda la ventana 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 un 503 al mismo tiempo. La fluctuación total distribuye sus primeros reintentos de manera uniforme en una ventana de 50 ms, en lugar de hacer que los 1000 reintentos se realicen exactamente a 50 ms.

Server-directed Tiempo de reintento

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 utiliza el retraso especificado por el servidor, limitado 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 retardo calculado tiene un límite de 20 segundos, el retardo máximo efectivo dirigido por el servidor es de 25 segundos. El SDK no aplica una fluctuación de fase a este valor, ya que se espera que el servicio la altere. Esto permite que el servicio se comunique exactamente cuando espera tener capacidad disponible.

Cuota de reintentos (grupo de fichas)

El SDK mantiene un presupuesto interno de fichas que registra la proporción de solicitudes aprobadas y rechazadas. 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 que se repitan los intentos, que es poco probable que se realicen correctamente. 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 comienza completo. Cada reintento deduce los tokens. Cuando un reintento se realiza correctamente, el SDK restaura los tokens consumidos en 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 volver a intentarlo y devuelve los errores directamente al código.

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

El mayor coste de los reintentos transitorios refleja su diferente patrón de fallos. Los errores transitorios, como los 500, y los fallos de conexión suelen indicar un problema en todo el servicio. En estas situaciones, es poco probable que los reintentos continuos tengan éxito. Añade latencia a las llamadas, agota 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 aceptarse. El SDK espera más tiempo entre reintentos para aumentar las probabilidades de éxito.

¿Cuándo se vuelve a intentar el bloque de cuotas

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

Un reintento exitoso solo restaura su propio coste simbólico (14 o 5 fichas), no el coste 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 reintentos múltiples 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 se traducen en errores transitorios sostenidos, o más de aproximadamente el 32% en el caso de errores de limitación. Por debajo de estas tasas, las solicitudes correctas reponen el presupuesto más rápido que los reintentos fallidos lo agotan.

El saldo inicial del presupuesto, de 500 fichas, proporciona un amortiguador que absorbe las pequeñas ráfagas de errores. Un breve aumento de errores, aunque sea grave, no bloquea los reintentos a menos que persista lo suficiente como para agotar el búfer.

Implicaciones prácticas

  • Bajas tasas de fracaso: la cuota no tiene ningún efecto. El presupuesto se mantiene al límite de su capacidad o cerca de ella.

  • Durante una interrupción del servicio: si un alto porcentaje de las solicitudes no se reciben correctamente durante un período prolongado, la cuota se agota y el cliente recibe los errores inmediatamente, en lugar de esperar a que los vuelva a intentar. Esto reduce la latencia del lado del cliente, libera hilos 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 correctos restablecen el coste total del token y el primer intento exitoso restaura 1 token. El presupuesto se rellena gradualmente y los reintentos se reanudan automáticamente.

  • Alcance: el presupuesto del token se suele destinar a una única instancia de cliente del SDK. El alcance exacto puede variar según el SDK. No se comparte entre procesos ni 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 DynamoDB predeterminado
Retardo base transitorio (sin regulación) 50 ms 25 ms
Retraso base de regulación 1000 ms 1000 ms
Número 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 para 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¿Qué ocurre cuando se produce un error en una solicitud), el SDK sigue aplicando un retraso antes de devolver el error al código.

Esto es importante porque las operaciones de sondeos prolongados suelen tener lugar en un bucle cerrado. El código llamaReceiveMessage, procesa cualquier mensaje y ReceiveMessage vuelve a llamar inmediatamente. Sin el retraso forzoso, si se agotara el presupuesto de fichas, el SDK generaría errores sin demora. Tu ciclo 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 retardo de espera forzado rompe este ciclo, lo que permite gestionar el uso de los recursos del cliente y la frecuencia de sondeo durante los fallos.

Support de AWS SDK y herramientas

En la siguiente tabla, 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 del antes y el después y ejemplos de código, consulta el tema de seguimiento. GitHub