Configurar los tiempos de espera en AWS SDK for Java 2.x - AWS SDK for Java 2.x

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.

Configurar los tiempos de espera en AWS SDK for Java 2.x

AWS SDK for Java 2.x Proporciona varios niveles de configuración de tiempo de espera para ayudarlo a crear aplicaciones resilientes. El SDK ofrece distintos 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 los clientes de servicio: tiempos de espera de alto nivel que controlan las operaciones de la API

  • Tiempos de espera de los clientes HTTP: tiempos de espera de bajo nivel que controlan la comunicación de la red

Tiempos de espera del cliente de servicio

Los tiempos de espera de los clientes de servicio funcionan a nivel de la API y controlan el comportamiento general de las operaciones del servicio, incluidos los reintentos y los intentos múltiples.

Tiempo de espera de las llamadas a la API

El tiempo de espera de las llamadas a la API establece el tiempo máximo para toda la 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 principales:

  • 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 intento 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 únicamente 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.

Configure los tiempos de espera del cliente 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"));

Mejores prácticas para los tiempos de espera de las API

El SDK para Java 2.x no establece los tiempos de espera de las llamadas a la API ni los tiempos de espera de los intentos de llamadas a la API individuales de forma predeterminada. Establece tiempos de espera tanto para los intentos individuales como para toda la solicitud. Esto ayuda a que la aplicación falle rápidamente cuando los problemas transitorios hacen que los intentos de solicitud se demoren más o cuando se producen problemas graves de red.

Tiempos de espera de los 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 la 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 final.

// Available with all HTTP clients. ApacheHttpClient.builder() .connectionTimeout(Duration.ofSeconds(5L)) .build();

Propósito:

  • Evita problemas de conectividad de red.

  • Falla rápidamente 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 (Apache y URLConnection clientes)

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 tiempos de espera separados para las 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 apretón de manos: TLS/SSL

NettyNioAsyncHttpClient.builder() .tlsNegotiationTimeout(Duration.ofSeconds(3L)) .build();

Tiempos de espera del 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()

Configure los clientes HTTPContiene más información sobre los clientes HTTP en el AWS SDK for Java 2.x

Interacciones y jerarquía de tiempos de espera

Comprender cómo interactúan los diferentes tiempos de espera es crucial para una configuración adecuada:

Jerarquía de tiempos de espera

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]

Reglas de configuración

Tiempo de espera de 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 los intentos múltiples
// 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.

Utilice los valores predeterminados de configuración inteligente

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:

  • Valores de tiempo de espera de conexión.

  • Valores de tiempo de espera de negociación de TLS.

  • Otros ajustes 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:

  1. Los tiempos de espera de los clientes de servicio controlan el comportamiento de las API de alto nivel.

  2. Los tiempos de espera de los clientes HTTP controlan el comportamiento de la red de bajo nivel.

  3. La jerarquía adecuada garantiza que los tiempos de espera funcionen juntos de forma eficaz.

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