网站首页 > 技术教程 正文
在 AWS SDK for Java 2.x 中引入基于 CRT 的 S3 客户端和 S3 Transfer Manager
xnh888 2024-11-12 13:45:00 技术教程 53 ℃ 0 评论我们很高兴地宣布 AWS SDK for Java 2.x 中两项新功能全面推出,这些功能支持使用 Amazon Simple Storage Service (Amazon S3) 加速对象传输:基于 AWS Common Runtime (CRT) 的 S3 开发工具包客户端和 S3 Transfer Manager。
基于 CRT 的 S3 客户端允许您通过自动利用 Amazon S3 分段上传 API 和字节范围提取,以增强的性能和可靠性将对象传入和传出 Amazon S3。它实现了与现有 S3 异步客户端相同的接口,并提供开箱即用的改进吞吐量。
S3 Transfer Manager 是建立在 S3 客户端之上的高级传输实用程序。它提供了一个简单的 API,允许您在应用程序和 Amazon S3 之间传输文件和目录。S3 Transfer Manager 还使您能够实时监控传输进度,并暂停传输以备日后执行。
下表显示了这两个新功能的用例。
这篇文章将引导您了解这些新增功能的主要功能,并向您展示如何使用它们。
主要特点
改进了上传、下载和复制的吞吐量
对于上传或复制 S3 对象请求,基于 CRT 的 S3 客户端可以将单个 PutObject 或 CopyObject 请求转换为多个 MultiPartUpload 请求,并并行发送这些请求以提高性能。
对于下载 S3 对象请求,基于 CRT 的 S3 客户端可以在提高性能时将 GetObject 请求拆分为多个较小的请求。这些请求将并行传输对象的不同部分,以实现更高的聚合吞吐量。
此外,在网络发生故障时,基于 CRT 的 S3 客户端会重试单个故障部件,而无需重新开始整个传输,从而提高了传输可靠性。
我们进行了性能测试,将基于 CRT 的 S3 客户端与现有的 S3 异步客户端进行了比较,并进行了操作。根据我们的测试,基于 CRT 的 S3 客户端对于 256MB 对象具有更好的性能。下表显示了这三项操作的改进百分比。我们希望客户能够观察到更大尺寸物体的更大改进。getObjectputObjectcopyObject
增强的连接管理
基于 CRT 的 S3 客户端提供增强的连接池和域名系统 (DNS) 负载平衡。在后台,基于 CRT 的 S3 客户端构建一个 Amazon S3 服务器 IP 池,并在多个 Amazon S3 终端节点之间实现负载平衡。这样可以提高吞吐量,超出单个服务器 IP 所能提供的吞吐量,并允许在不太可能发生的端点慢速或服务器中断的情况下自动故障转移。
更快的启动时间
通过使用基于 CRT 的 S3 客户端,您可以从更快的启动时间中受益。我们观察到,在现有 S3 客户端和基于 CRT 的新 S3 客户端之间,AWS Lambda 启动性能提高了 68%。请注意,结果可能因应用程序配置而异。
下表比较了使用现有 S3 异步客户端和新的基于 CRT 的 S3 客户端调用 ListBuckets API 的 AWS Lambda 冷启动持续时间。
开始
基于 CRT 的 S3 客户端
为基于 CRT 的 S3 客户端添加依赖项
首先,您需要向项目添加两个依赖项。在 Maven 中央存储库中搜索最新版本的 s3 和 aws-crt 构件。
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk.crt</groupId>
<artifactId>aws-crt</artifactId>
<version>${aws.crt.version}</version>
</dependency>
XML格式
实例化基于 CRT 的 S3 客户端
您可以使用默认设置轻松实例化基于 CRT 的 S3 客户端。
S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate();
如果需要配置客户端,可以使用客户端构建器。通过更改构建器方法,您可以轻松地从基于 Java 的 S3 客户端切换到基于 CRT 的客户端。请注意,标准构建器中提供的某些设置当前可能不受 CRT 构建器支持。
S3AsyncClient s3AsyncClient =
S3AsyncClient.crtBuilder()
.credentialsProvider(DefaultCredentialsProvider.create())
.region(Region.US_WEST_2)
.targetThroughputInGbps(20.0)
.minimumPartSizeInBytes(8 * MB)
.build();
调用 S3 API
您可以使用基于 CRT 的 S3 客户端调用任何 Amazon S3 API。在下一节中,我们将向您展示如何调用 和 。PutObjectGetObject
S3AsyncClient s3Client = S3AsyncClient.crtCreate();
// Upload a local file to Amazon S3
PutObjectResponse putObjectResponse =
s3Client.putObject(req -> req.bucket("myBucket")
.key("myKey"),
AsyncRequestBody.fromFile(Paths.get("myFile.txt")))
.join();
// Download an object from Amazon S3 to a local file
GetObjectResponse getObjectResponse =
s3Client.getObject(req -> req.bucket("myBucket")
.key("myKey"),
AsyncResponseTransformer.toFile(Paths.get("myFile.txt")))
.join();
S3 传输管理器
为 S3 Transfer Manager 添加依赖项
首先,您需要在项目中包含 和 依赖项。在 Maven 中央存储库中搜索最新版本的 s3-transfer-manager 和 aws-crt 构件。s3-transfer-manageraws-crt
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk.crt</groupId>
<artifactId>aws-crt</artifactId>
<version>${aws.crt.version}</version>
</dependency>
XML格式
实例化 S3 Transfer Manager
您可以使用以下代码片段使用默认设置实例化 Transfer Manager。
S3TransferManager transferManager = S3TransferManager.create();
如果您希望配置设置,或使用已构建的基于 CRT 的底层 S3 客户端,我们建议您改用构建器:
S3AsyncClient s3AsyncClient =
S3AsyncClient.crtBuilder()
.credentialsProvider(DefaultCredentialsProvider.create())
.region(Region.US_WEST_2)
.targetThroughputInGbps(20.0)
.minimumPartSizeInBytes(8 * MB)
.build();
S3TransferManager transferManager =
S3TransferManager.builder()
.s3Client(s3AsyncClient)
.build();
传输单个对象
将文件上传到 S3 并使用 TransferListener 记录上传进度
要将文件上传到 Amazon S3,您需要提供源文件路径和指定目标存储桶和密钥的 PutObjectRequest。或者,您可以通过附加 TransferListener 来监视传输进度。提供的 LoggingTransferListener 记录基本进度条;用户还可以实现自己的侦听器。
S3TransferManager transferManager = S3TransferManager.create();
UploadFileRequest uploadFileRequest =
UploadFileRequest.builder()
.putObjectRequest(req -> req.bucket("bucket").key("key"))
.addTransferListener(LoggingTransferListener.create())
.source(Paths.get("myFile.txt"))
.build();
FileUpload upload = transferManager.uploadFile(uploadFileRequest);
// Wait for the transfer to complete
upload.completionFuture().join();
将 S3 对象下载到本地文件,并使用 TransferListener 记录下载进度
要下载对象,您需要提供目标文件路径和指定源存储桶和密钥的 GetObjectRequest。与上传一样,您可以通过附加 TransferListener 来监控传输进度。
S3TransferManager transferManager = S3TransferManager.create();
DownloadFileRequest downloadFileRequest =
DownloadFileRequest.builder()
.getObjectRequest(req -> req.bucket("bucket").key("key"))
.destination(Paths.get("myFile.txt"))
.addTransferListener(LoggingTransferListener.create())
.build();
FileDownload download = transferManager.downloadFile(downloadFileRequest);
// Wait for the transfer to complete
download.completionFuture().join();
将 S3 对象从一个位置复制到另一个位置
若要复制对象,需要为 CopyObjectRequest 提供源和目标位置。
S3TransferManager transferManager = S3TransferManager.create();
CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder()
.sourceBucket("source_bucket")
.sourceKey("source_key")
.destinationBucket("dest_bucket")
.destinationKey("dest_key")
.build();
CopyRequest copyRequest = CopyRequest.builder()
.copyObjectRequest(copyObjectRequest)
.build();
Copy copy = transferManager.copy(copyRequest);
// Wait for the transfer to complete
CompletedCopy completedCopy = copy.completionFuture().join();
在同一目录中传输多个对象
将本地目录上传到 S3 存储桶
要以递归方式将本地目录上传到 S3 存储桶,您需要提供源目录和目标存储桶。
S3TransferManager transferManager = S3TransferManager.create();
DirectoryUpload directoryUpload =
transferManager.uploadDirectory(UploadDirectoryRequest.builder()
.source(Paths.get("source/directory"))
.bucket("bucket")
.build());
// Wait for the transfer to complete
CompletedDirectoryUpload completedDirectoryUpload = directoryUpload.completionFuture().join();
// Print out the failed uploads
completedDirectoryUpload.failedTransfers().forEach(System.out::println);
将同一存储桶中的 S3 对象下载到本地目录
要下载同一存储桶中的所有 S3 对象,您需要提供目标目录和源存储桶。
S3TransferManager transferManager = S3TransferManager.create();
DirectoryDownload directoryDownload =
transferManager.downloadDirectory(DownloadDirectoryRequest.builder()
.destination(Paths.get("destination/directory"))
.bucket("bucket")
.build());
// Wait for the transfer to complete
CompletedDirectoryDownload completedDirectoryDownload = directoryDownload.completionFuture().join();
// Print out the failed downloads
completedDirectoryDownload.failedTransfers().forEach(System.out::println);
结论
在这篇博文中,我们介绍了适用于 Java 的 AWS 开发工具包 2.x 中基于 CRT 的 S3 客户端和 S3 Transfer Manager 的主要功能。我们向您展示了利用它们传输对象是多么容易。要了解有关如何设置和开始使用这些功能的更多信息,请访问我们的开发人员指南和 API 参考。今天就试试吧,让我们看看你的想法吧!您可以通过在我们的 GitHub 存储库上创建问题来与我们联系。
猜你喜欢
- 2024-11-12 【Java面试】OOM你遇到过哪些情况,SOF你遇到过哪些情况?
- 2024-11-12 Java干货:InetAddress基本操作演示
- 2024-11-12 Redis 哈希表 VS Java HaspMap , 哪家强?
- 2024-11-12 Java历史上接口的演变(java接口通俗理解)
- 2024-11-12 鸿蒙系统中的 JS 开发框架(js开发鸿蒙app)
- 2024-11-12 Java和JavaScript有什么区别?(javascript和java区别大吗)
- 2024-11-12 初识sa-token,一行代码搞定登录授权
- 2024-11-12 Java读取XML文件缺少部分字符串(java读取xml文件中的内容)
- 2024-11-12 Java的虚拟线程如何帮助您的业务?
- 2024-11-12 Clojure vs Java:少数据结构、多函数胜过多个单独类的优点
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)