本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用高性能 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 客户端是 S3AsyncClientS3AsyncClient
接口实现的替代方案,具有多种优势。
基于 Amazon CRT 的 HTTP 客户端是 SdkAsyncHttpClientSdkAsyncHttpClient
接口实现的替代方案,具有多种优势。
尽管两个组件都使用 Amazon 通用运行时系统中的库,但基于 Amazon CRT 的 S3 客户端使用 aws-c-s3 库
添加依赖项以使用基于 Amazon CRT 的 S3 客户端
要使用基于 Amazon CRT 的 S3 客户端,请将以下两个依赖项添加到您的 Maven 项目文件中。示例显示了要使用的最低版本。在 Maven Central 存储库中搜索 s3
<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 使用的 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();