Utilizar un cliente S3 de alto rendimiento: cliente S3 basado en CRT AWS
El cliente S3 basado en AWS CRT, creado sobre el AWSCommon Runtime (CRT), es un cliente asíncrono S3 alternativo. Transfiere objetos hacia y desde Amazon Simple Storage Service (Amazon S3) con un rendimiento y una fiabilidad mejorados mediante el uso automático de la API de carga multiparte de Amazon S3 y de las recuperaciones por rango de bytes.
El cliente S3 basado en AWS CRT mejora la fiabilidad de la transferencia en caso de que se produzca un fallo en la red. La fiabilidad se mejora reintentando partes individuales fallidas de una transferencia de archivos sin reiniciar la transferencia desde el principio.
Además, el cliente S3 basado en AWS CRT ofrece una mejor agrupación de conexiones y un equilibrio de carga del Sistema de Nombres de Dominio (DNS) mejorados, lo que también mejora el rendimiento.
Puede utilizar el cliente S3 basado en AWS CRT en lugar del cliente asíncrono S3 estándar del SDK y aprovechar su rendimiento mejorado de forma inmediata.
importante
El cliente de S3 basado en AWS CRT no admite actualmente la recopilación de métricas del SDK en el nivel del cliente ni en el nivel de la solicitud.
AWS Componentes basados en CRT en el SDK
El cliente S3 basado en AWS CRT, que se describe en este tema, y el cliente HTTP basado en AWS CRT son componentes diferentes del SDK.
El cliente S3 AWS basado en CRT es una implementación de la interfaz S3AsyncClientS3AsyncClient basada en Java y ofrece varias ventajas.
El cliente HTTP basado en AWS CRT es una implementación de la interfaz SDKAsynchTTPClientSdkAsyncHttpClient basada en Java y ofrece varias ventajas.
Aunque ambos componentes utilizan bibliotecas del AWS Common Runtime, el cliente de S3 basado en AWS CRT utiliza la biblioteca aws-c-s3
Agregar dependencias para usar el cliente S3 basado en AWS CRT
Para usar el cliente S3 basado en AWS CRT, añada las dos dependencias siguientes al archivo de proyecto de Maven. En el ejemplo siguiente se muestran las versiones mínimas que se utilizarán. Busque en el repositorio central de Maven las versiones más recientes de los artefactos s3
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.27.21</version> </dependency> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.30.11</version> </dependency>
Crear una instancia del cliente S3 basado en AWS CRT
Cree una instancia del cliente S3 basado en AWS CRT con la configuración predeterminada, como se muestra en el siguiente fragmento de código.
S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate();
Para configurar el cliente, utilice el generador de clientes AWS CRT. Puede cambiar del cliente asíncrono S3 estándar al cliente basado en AWS CRT cambiando el método de creación.
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3AsyncClient; S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_WEST_2) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * 1025 * 1024L) .build();
nota
Es posible que algunas de las configuraciones del generador estándar no sean compatibles actualmente con el generador de clientes AWS CRT. Obtener el constructor estándar llamando a S3AsyncClient#builder().
Utilizar el Cliente S3 basado en AWS CRT
Utilice el cliente S3 basado en AWS CRT para llamar a las operaciones de API de Amazon S3. El ejemplo siguiente muestra las operaciones PutObject
import software.amazon.awssdk.core.async.AsyncRequestBody; import software.amazon.awssdk.core.async.AsyncResponseTransformer; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.PutObjectResponse; S3AsyncClient s3Client = S3AsyncClient.crtCreate(); // Upload a local file to Amazon S3. PutObjectResponse putObjectResponse = s3Client.putObject(req -> req.bucket(<BUCKET_NAME>) .key(<KEY_NAME>), AsyncRequestBody.fromFile(Paths.get(<FILE_NAME>))) .join(); // Download an object from Amazon S3 to a local file. GetObjectResponse getObjectResponse = s3Client.getObject(req -> req.bucket(<BUCKET_NAME>) .key(<KEY_NAME>), AsyncResponseTransformer.toFile(Paths.get(<FILE_NAME>))) .join();
Carga de flujos de tamaño desconocido
Una ventaja importante del cliente de S3 basado en AWS AWS CRT es su capacidad para administrar flujos de entrada de tamaño desconocido de manera eficiente. Esto resulta especialmente útil cuando se deben cargar datos desde una fuente en la que el tamaño total no se puede determinar de antemano.
public PutObjectResponse crtClient_stream_unknown_size(String bucketName, String key, InputStream inputStream) { S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate(); ExecutorService executor = Executors.newSingleThreadExecutor(); AsyncRequestBody body = AsyncRequestBody.fromInputStream(inputStream, null, executor); // 'null' indicates that the // content length is unknown. CompletableFuture<PutObjectResponse> responseFuture = s3AsyncClient.putObject(r -> r.bucket(bucketName).key(key), body) .exceptionally(e -> { if (e != null){ logger.error(e.getMessage(), e); } return null; }); PutObjectResponse response = responseFuture.join(); // Wait for the response. executor.shutdown(); return response; }
Esta capacidad ayuda a evitar problemas comunes de las cargas tradicionales, en los que una especificación incorrecta de la longitud del contenido puede provocar que los objetos se trunquen o fallen las cargas.
Limitaciones de la configuración
El cliente de S3 basado en AWS CRT y el cliente asincrónico de S3 basado en Java ofrecen características comparables, mientras que el cliente de S3 basado en CRT de AWS ofrece una ventaja de rendimiento. Sin embargo, el cliente de S3 basado en AWS CRT carece de los ajustes de configuración que tiene el cliente asincrónico de S3 basado en Java. Esta configuración incluye:
-
Configuración de nivel de cliente: tiempo de espera de intentos de llamada a la API, interceptores de ejecución de compresión, publicadores de métricas, atributos de ejecución personalizados, opciones avanzadas personalizadas, servicio de ejecutor programado personalizado, encabezados personalizados
-
Configuración de nivel de solicitud: firmantes personalizados, proveedores de credenciales, tiempo de espera de intentos de llamada a la API
Para obtener una lista completa de las diferencias de configuración, consulte la referencia de la API.
| Cliente asincrónico de S3 basado en Java | Cliente S3 basado en AWS CRT |
|---|---|
| Configuraciones de nivel de cliente Configuraciones de nivel de solicitud |
Configuraciones de nivel de cliente Configuraciones sin nivel de solicitud |