Prácticas recomendadas para 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.

Prácticas recomendadas para AWS SDK for Java 2.x

En esta sección, se describen las prácticas recomendadas para utilizar el SDK para Java 2.x.

Reutilizar un cliente del SDK, si es posible

Cada cliente del SDK mantiene su propio grupo de conexiones HTTP. Una conexión que ya existe en el grupo se puede reutilizar mediante una nueva solicitud para reducir el tiempo necesario para establecer una nueva conexión. Recomendamos compartir una sola instancia del cliente para evitar la sobrecarga que supone tener demasiados grupos de conexiones que no se utilizan de forma eficaz. Todos los clientes del SDK son seguros para subprocesos.

Si no quiere compartir una instancia de cliente, utilice close() en la instancia para liberar los recursos cuando el cliente no sea necesario.

Cerrar las secuencias de entrada de las operaciones del cliente

Para operaciones de secuencia, como S3Client#getObject, si trabaja directamente con ResponseInputStream, recomendamos que haga lo siguiente:

  • Lea todos los datos de la secuencia de entrada lo antes posible.

  • Cierre la secuencia de entrada cuanto antes.

Hacemos estas recomendaciones porque la secuencia de entrada es un flujo directo de datos de la conexión HTTP y la conexión HTTP subyacente no se puede reutilizar hasta que se hayan leído todos los datos de la secuencia y esta se cierre. Si no se siguen estas reglas, el cliente puede quedarse sin recursos por asignar demasiadas conexiones HTTP abiertas pero no utilizadas.

Ajustar las configuraciones HTTP en función de las pruebas de rendimiento

El SDK proporciona un conjunto de configuraciones http predeterminadas que se aplican a los casos de uso generales. Recomendamos a los clientes que definan las configuraciones HTTP de sus aplicaciones en función de sus casos de uso.

Como buen punto de partida, el SDK ofrece una característica de configuración inteligente de valores predeterminados. Esta característica está disponible a partir de la versión 2.17.102. Debe seleccionar un modo según su uso, lo que proporciona valores de configuración razonables.

Utilizar OpenSSL para el cliente HTTP basado en Netty

De forma predeterminada, el NettyNioAsyncHttpClient de SDK utiliza la implementación SSL predeterminada del JDK como SslProvider. Nuestras pruebas revelaron que OpenSSL funciona mejor que la implementación predeterminada de JDK. La comunidad de Netty también recomienda usar OpenSSL.

Para usar OpenSSL, agregue netty-tcnative a sus dependencias. Para obtener detalles de configuración, consulte la documentación del proyecto Netty.

Una vez que haya configurado su proyecto con netty-tcnative, la instancia del NettyNioAsyncHttpClient seleccionará OpenSSL automáticamente. Como alternativa, puede configurar el SslProvider de forma explícita mediante el compilador de NettyNioAsyncHttpClient, como muestra el siguiente fragmento.

NettyNioAsyncHttpClient.builder() .sslProvider(SslProvider.OPENSSL) .build();

Configurar los tiempos de espera de la API

El SDK proporciona valores predeterminados para algunas opciones de tiempo de espera, como el tiempo de espera de la conexión y los tiempos de espera del socket, pero no 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 garantizará que la aplicación pueda responder rápido a los errores y de forma óptima cuando se produzcan problemas transitorios que puedan provocar que los intentos de solicitud tarden más en completarse o surjan problemas graves de red.

Puede configurar los tiempos de espera para todas las solicitudes realizadas por los clientes de un servicio mediante ClientOverrideConfiguration#apiCallAttemptTimeout y ClientOverrideConfiguration#apiCallTimeout.

En el siguiente ejemplo, se muestra la configuración de un cliente Amazon S3 con valores de tiempo de espera personalizados.

S3Client.builder() .overrideConfiguration( b -> b.apiCallTimeout(Duration.ofSeconds(<custom value>)) .apiCallAttemptTimeout(Duration.ofMillis(<custom value>))) .build();
apiCallAttemptTimeout

Esta configuración establece la cantidad de tiempo para un único intento HTTP, tras el cual se puede volver a intentar la llamada a la API.

apiCallTimeout

El valor de esta propiedad configura la cantidad de tiempo de toda la ejecución, incluidos todos los reintentos.

Como alternativa a establecer estos valores de tiempo de espera en el cliente de servicio, puede usar RequestOverrideConfiguration#apiCallTimeout() y RequestOverrideConfiguration#apiCallAttemptTimeout() para configurar una sola solicitud.

El ejemplo siguiente configura una única solicitud de listBuckets con valores de tiempo de espera personalizados.

s3Client.listBuckets(lbr -> lbr.overrideConfiguration( b -> b.apiCallTimeout(Duration.ofSeconds(<custom value>)) .apiCallAttemptTimeout(Duration.ofMillis(<custom value>))));

Al utilizar juntas estas propiedades, establece un límite estricto en el tiempo total dedicado a todos los intentos entre reintentos. También configura una solicitud HTTP individual para poder responder rápido a los errores en las solicitudes lentas.

Utilizar métricas

El SDK para Java puede recopilar métricas para los clientes de servicio de su aplicación. Puede utilizar estas métricas para identificar problemas de rendimiento, revisar las tendencias generales de uso, revisar las excepciones de clientes de servicio devueltas o profundizar para comprender un problema concreto.

Le recomendamos que recopile métricas y, a continuación, analice los registros de Amazon CloudWatch para conocer mejor el rendimiento de su aplicación.