使用高性能 S3 客户端:基于 Amazon CRT 的 S3 客户端 - Amazon SDK for Java 2.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用高性能 S3 客户端:基于 Amazon CRT 的 S3 客户端

基于 Amazon CRT 的 S3 客户端(构建于 Amazon 通用运行时系统 (CRT) 之上)是一种备选 S3 异步客户端。它通过自动使用 Amazon S3 的分段上传 API字节范围提取,将对象传入或传出 Amazon Simple Storage Service (Amazon S3),从而提高了性能和可靠性。

基于 Amazon CRT 的 S3 客户端可提高发生网络故障时的传输可靠性。通过重试文件传输中失败的各个分段,而无需从头开始重新启动传输,从而提高可靠性。

此外,基于 Amazon CRT 的 S3 客户端还提供了增强的连接池和域名系统 (DNS) 负载平衡,这也提高了吞吐量。

您可以使用基于 Amazon CRT 的 S3 客户端来代替 SDK 的标准 S3 异步客户端,并立即利用其提高的吞吐量。

SDK 中基于 Amazon CRT 的组件

本主题中介绍的基于 Amazon CRT 的 S3 客户端,与基于 Amazon CRT 的 HTTP 客户端是 SDK 中的不同组件。

基于 Amazon CRT 的 S3 客户端S3AsyncClient 接口的实现,用于与 Amazon S3 服务配合使用。它是基于 Java 的 S3AsyncClient 接口实现的替代方案,具有多种优势。

基于 Amazon CRT 的 HTTP 客户端SdkAsyncHttpClient 接口的实现,用于一般 HTTP 通信。它是 Netty SdkAsyncHttpClient 接口实现的替代方案,具有多种优势。

尽管两个组件都使用 Amazon 通用运行时系统中的库,但基于 Amazon CRT 的 S3 客户端使用 aws-c-s3 库,并支持 S3 分段上传 API 功能。由于基于 Amazon CRT 的 HTTP 客户端仅用于一般用途,因此它不支持 S3 分段上传 API 功能。

添加依赖项以使用基于 Amazon CRT 的 S3 客户端

要使用基于 Amazon CRT 的 S3 客户端,请将以下两个依赖项添加到您的 Maven 项目文件中。示例显示了要使用的最低版本。在 Maven Central 存储库中搜索 s3aws-crt 构件的最新版本。

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.20.68</version> </dependency> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.21.16</version> </dependency>

创建基于 Amazon CRT 的 S3 客户端的实例

使用默认设置创建 基于 Amazon CRT 的 S3 客户端的实例,如以下代码段所示。

S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate();

要配置客户端,请使用 Amazon CRT 客户端生成器。您可以通过更改生成器方法,从标准 S3 异步客户端切换到基于 Amazon CRT 的客户端。

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();
注意

Amazon CRT 客户端生成器目前可能不支持标准生成器中的某些设置。通过调用 S3AsyncClient#builder() 获取标准生成器。

使用基于 Amazon CRT 的 S3 客户端。

使用基于 Amazon CRT 的 S3 客户端来调用 Amazon S3 API 操作。以下示例演示可通过Amazon SDK for Java 使用的 PutObjectGetObject 操作。

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();