Configuración de tiempos de espera en AWS SDK for Java 2.x
AWS SDK for Java 2.x proporciona varias capas de configuración de tiempo de espera para ayudarlo a crear aplicaciones resilientes. El SDK ofrece diferentes tipos de tiempos de espera que funcionan en conjunto para optimizar el rendimiento y la fiabilidad de la aplicación.
Existen dos categorías principales de tiempos de espera en el SDK:
-
Tiempos de espera de clientes de servicio: tiempos de espera de alto nivel que controlan las operaciones de la API
-
Tiempos de espera de clientes de HTTP: tiempos de espera de bajo nivel que controlan la comunicación de la red
Tiempos de espera de clientes de servicio
Los tiempos de espera de los clientes de servicio funcionan en el nivel de la API y controlan el comportamiento general de las operaciones de servicio, incluidos los reintentos y los intentos múltiples.
Tiempo de espera de llamadas a la API
El tiempo de espera de llamada a la API establece la cantidad máxima de tiempo de toda una operación de la API, incluidos todos los reintentos. Este tiempo de espera establece un límite estricto del tiempo que la aplicación debe esperar a que finalice una operación completa.
S3Client s3Client = S3Client.builder() .overrideConfiguration(ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofMinutes(2)) // Total time for entire operation, such as when you call the getObject method. .build()) .build();
Características clave:
Incluye todos los reintentos.
Incluye el tiempo de espera entre reintentos.
Proporciona el tiempo de espera máximo absoluto.
Impide que las operaciones se ejecuten indefinidamente.
Tiempo de espera del intentos de llamada a la API
El tiempo de espera del intento de llamada a la API establece el tiempo máximo para un solo intento de una operación de API. Si se supera este tiempo de espera, el SDK vuelve a intentar la operación (si los reintentos están configurados) en lugar de fallar toda la llamada.
S3Client s3Client = S3Client.builder() .overrideConfiguration(ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(30)) // Time for single attempt. .build()) .build();
Características clave:
Se aplica solo a los intentos individuales.
Permite realizar errores y reintentos rápidos en el caso de solicitudes lentas.
Debe ser inferior al tiempo de espera de las llamadas a la API.
Ayuda a identificar problemas transitorios y a recuperarse de ellos.
Configurar clientes de servicio
Puede configurar los tiempos de espera de los clientes de servicio de forma global para todas las operaciones o por solicitud:
Configuración global:
S3Client s3Client = S3Client.builder() .overrideConfiguration(b -> b .apiCallTimeout(Duration.ofSeconds(105L)) .apiCallAttemptTimeout(Duration.ofSeconds(25L))) .build(); // When you use the s3Client for an API operation, the SDK uses the configured timeout values.
Configuración por solicitud:
S3Client basicS3Client = S3Client.create(); // The following configuration uses the same settings as shown before, but these settings // apply to only the `putObject` call. When you use `basicS3Client` in another API call without // supplying the override configuration, there are no API timeout limits. No timeout limits is the default for the SDK. AwsRequestOverrideConfiguration overrideConfiguration = AwsRequestOverrideConfiguration.builder() .apiCallTimeout(Duration.ofSeconds(105L)) .apiCallAttemptTimeout(Duration.ofSeconds(25L)) .build(); basicS3Client.putObject(b -> b .bucket("amzn-s3-demo-bucket") .key("example-key") .overrideConfiguration(overrideConfiguration), RequestBody.fromString("test"));
Prácticas recomendadas para timeout de la API
El SDK no proporciona valores predeterminados para los tiempos de espera de las llamadas a la API ni para los tiempos de espera de los intentos de llamadas individuales a la API. Se recomienda establecer tiempos de espera tanto para los intentos individuales como para toda la solicitud. Esto ayuda a que su aplicación responda rápido a los problemas transitorios hacen que los intentos de solicitud tarden más tiempo o cuando se producen problemas graves de red.
Tiempo de espera de clientes HTTP
Los tiempos de espera de los clientes HTTP funcionan a nivel de red y controlan varios aspectos de la comunicación HTTP. Estos tiempos de espera varían según la implementación de cliente HTTP que utilice.
Tiempo de espera de conexión
El tiempo de espera de la conexión controla el tiempo de espera al establecer una nueva conexión con el Servicio de AWS punto de conexión.
// Available with all HTTP clients. ApacheHttpClient.builder() .connectionTimeout(Duration.ofSeconds(5L)) .build();
Finalidad:
Evita problemas de conectividad de red.
Responde rápido a los errores cuando no se puede acceder a los servicios.
Esencial para las aplicaciones que necesitan una gestión de errores con capacidad de respuesta.
Tiempo de espera de los sockets (clientes Apache y URLConnection)
El tiempo de espera del socket controla el tiempo de espera para recibir datos en una conexión establecida.
ApacheHttpClient.builder() .socketTimeout(Duration.ofSeconds(30L)) // Time to wait for response data. .build();
Tiempos de espera de lectura y escritura (cliente Netty)
El cliente Netty proporciona timeout separados para operaciones de lectura y escritura:
NettyNioAsyncHttpClient.builder() .readTimeout(Duration.ofSeconds(30L)) // Reading response data. .writeTimeout(Duration.ofSeconds(30L)) // Writing request data. .build();
Tiempo de espera de negociación de TLS (cliente Netty)
Controla el tiempo permitido para el establecimiento de comunicación de TLS/SSL:
NettyNioAsyncHttpClient.builder() .tlsNegotiationTimeout(Duration.ofSeconds(3L)) .build();
Tiempo de espera de grupo de conexiones
Algunos clientes HTTP proporcionan tiempos de espera para las operaciones del grupo de conexiones:
ApacheHttpClient.builder() .connectionAcquisitionTimeout(Duration.ofSeconds(10L)) // Wait for pool connection. .connectionTimeToLive(Duration.ofMinutes(5L)) // Maximum connection age. .connectionMaxIdleTime(Duration.ofSeconds(60L)) // Maximum idle time. .build()
Configuración de clientes de HTTPContiene más información sobre los clientes HTTP en el AWS SDK for Java 2.x
Interacciones de timeout y jerarquía
Comprender cómo interactúan los diferentes tiempos de espera es crucial para una configuración adecuada:
Jerarquía de timeout
API Call Timeout (2 minutes) ├── Retry Attempt 1 │ ├── API Call Attempt Timeout (45 seconds) │ └── HTTP Client Timeouts │ ├── Connection Timeout (5 seconds) │ ├── TLS Negotiation Timeout (3 seconds) │ └── Read/Write Timeout (30 seconds) ├── Retry Attempt 2 │ └── [Same structure as Attempt 1] └── Retry Attempt 3 └── [Same structure as Attempt 1]
Configuración de reglas
- Tiempo de espera de la llamada a la API ≥ tiempo de espera del intento de llamada a la API
-
// Correct configuration. .apiCallTimeout(Duration.ofMinutes(2)) // 120 seconds. .apiCallAttemptTimeout(Duration.ofSeconds(30)) // 30 seconds. - Tiempo de espera del intento de llamada a la API ≥ tiempos de espera del cliente HTTP
-
// HTTP client timeouts must be less than attempt timeout. .apiCallAttemptTimeout(Duration.ofSeconds(30L)) // 30 seconds. // HTTP client configuration. .connectionTimeout(Duration.ofSeconds(5L)) // 5 seconds. .readTimeout(Duration.ofSeconds(25L)) // 25 seconds (< 30). - Tenga en cuenta varios intentos
-
// If you have 3 retry attempts, each taking up to 30 seconds // API call timeout must be at least 90 seconds plus overhead. .apiCallTimeout(Duration.ofMinutes(2L)) // 120 seconds. .apiCallAttemptTimeout(Duration.ofSeconds(30)) // 30 seconds per attempt.
configuración inteligente predeterminada
El SDK proporciona valores predeterminados inteligentes que configuran automáticamente los valores de tiempo de espera adecuados:
// Enable smart defaults. S3Client client = S3Client.builder() .defaultsMode(DefaultsMode.AUTO) // Automatically choose appropriate defaults. .build(); // Available modes: // - STANDARD: Balanced defaults // - IN_REGION: Optimized for same-region calls // - CROSS_REGION: Optimized for cross-region calls // - MOBILE: Optimized for mobile applications // - AUTO: Automatically detect and choose appropriate mode // - LEGACY: Provides settings that were used before smart defaults existed.
Los valores predeterminados inteligentes configuran automáticamente:
Tiempos de espera de conexión.
Valores de tiempo de espera de negociación de TLS.
Otras configuraciones del cliente.
Resumen
La configuración efectiva de los tiempos de espera AWS SDK for Java 2.x requiere comprender la interacción entre los tiempos de espera del cliente de servicio y los tiempos de espera del cliente HTTP:
Los tiempos de espera de los clientes de servicio controlan el comportamiento de las API de alto nivel.
Los tiempos de espera de los clientes HTTP controlan el comportamiento de la red de bajo nivel.
La jerarquía adecuada garantiza que los tiempos de espera funcionen juntos de forma eficaz.
Los valores predeterminados inteligentes proporcionan buenos puntos de partida para la mayoría de las aplicaciones.
Configure los tiempos de espera de forma adecuada para su caso de uso a fin de crear aplicaciones que sean resistentes a los problemas de la red y que respondan a las necesidades de los usuarios.