Giới thiệu CRT-based S3 Client và S3 Transfer Manager trong AWS SDK cho Java 2.x

Chúng tôi rất phấn khích thông báo sẵn sàng chung hai tính năng mới trong AWS SDK cho Java 2.x cho việc truyền đối tượng tăng tốc với Amazon Simple Storage Service (Amazon S3): Một AWS Common Runtime (CRT)-based S3 SDK client và S3 Transfer Manager.

Client CRT-based S3 cho phép bạn truyền đối tượng tới và từ Amazon S3 với hiệu suất và độ tin cậy được nâng cao bằng cách tự động tận dụng Amazon S3 multipart upload APIbyte-range fetches. Nó thực hiện cùng giao diện với S3 async client hiện có và cung cấp khả năng thông lượng tốt hơn ngay lập tức.

S3 Transfer Manager là một tiện ích truyền cao cấp được xây dựng trên cơ sở của S3 client. Nó cung cấp một API đơn giản cho phép bạn truyền tệp và thư mục giữa ứng dụng của bạn và Amazon S3. S3 Transfer Manager cũng cho phép bạn theo dõi tiến trình truyền trong thời gian thực và tạm dừng việc truyền để thực hiện sau này.

Bảng dưới đây hiển thị các trường hợp sử dụng cho hai tính năng mới này.

Bài viết này sẽ hướng dẫn bạn qua các tính năng chính của những bổ sung này và chỉ bạn cách sử dụng chúng.

Các Tính Năng Chính

Tăng thông lượng cải thiện cho việc tải lên, tải xuống và sao chép

Đối với yêu cầu tải lên hoặc sao chép đối tượng S3, Client CRT-based S3 có khả năng chuyển đổi một yêu cầu PutObject hoặc CopyObject đơn lẻ thành nhiều yêu cầu MultiPartUpload và gửi những yêu cầu đó song song để cải thiện hiệu suất.

Đối với yêu cầu tải đối tượng S3, Client CRT-based S3 có khả năng chia yêu cầu GetObject thành nhiều yêu cầu nhỏ hơn khi nó cải thiện hiệu suất. Những yêu cầu này sẽ truyền các phần khác nhau của đối tượng một cách song song để đạt được thông lượng tổng hợp cao hơn.

Ngoài ra, trong trường hợp mất kết nối mạng, Client CRT-based S3 sẽ thử lại từng phần thất bại mà không cần bắt đầu lại toàn bộ quá trình truyền, cải thiện độ tin cậy trong việc truyền tải.

Chúng tôi đã thực hiện các bài kiểm tra hiệu suất so sánh Client CRT-based S3 với Client S3 async hiện có cho các hoạt động getObject, putObject và copyObject. Từ các bài kiểm tra của chúng tôi, Client CRT-based S3 có hiệu suất tốt hơn cho một đối tượng 256MB. Bảng dưới đây cho bạn thấy tỷ lệ cải thiện cho ba hoạt động đó. Chúng tôi mong đợi Client sẽ thấy sự cải thiện thậm chí lớn hơn cho các đối tượng có kích thước lớn hơn.

Quản lý kết nối nâng cao

Client CRT-based S3 cung cấp quản lý gộp kết nối nâng cao và cân bằng tải Hệ thống Tên Miền (DNS). Bên dưới, Client CRT-based S3 xây dựng một nhóm địa chỉ IP máy chủ Amazon S3 và cân bằng tải qua nhiều địa chỉ IP máy chủ Amazon S3 khác nhau. Điều này cải thiện thông lượng vượt ra ngoài những gì một địa chỉ IP máy chủ duy nhất có thể cung cấp và cho phép tự động chuyển tiếp khi có sự cố không thường xuyên xảy ra với đầu cuối hoặc máy chủ chậm.

Thời gian khởi đầu nhanh hơn

Bạn có thể hưởng lợi từ thời gian khởi đầu nhanh hơn bằng cách sử dụng Client CRT-based S3. Chúng tôi đã quan sát được cải thiện lên đến 68% trong hiệu suất khởi đầu của AWS Lambda giữa Client S3 hiện có và Client CRT-based S3 mới. Lưu ý rằng kết quả có thể thay đổi dựa trên cấu hình ứng dụng của bạn.

Biểu đồ sau so sánh thời gian khởi đầu lạnh của AWS Lambda bằng cách gọi API ListBuckets bằng Client S3 async hiện có và Client CRT-based S3 mới.

Bắt đầu

Client CRT-Based S3

Thêm một phụ thuộc cho Client CRT-Based S3

Trước tiên, bạn cần thêm hai phụ thuộc vào dự án của bạn. Tìm kiếm kho lưu trữ trung tâm Maven để tìm phiên bản mới nhất của các tác phẩm nghệ thuật s3 và aws-crt.

XML
<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>

Khởi tạo Client CRT-Based S3

Bạn có thể dễ dàng khởi tạo Client CRT-Based S3 bằng cách sử dụng các thiết lập mặc định.

Java

S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate();

Nếu bạn cần cấu hình Client, bạn có thể sử dụng bộ xây dựng của Client. Bạn có thể dễ dàng chuyển từ một Client S3 dựa trên Java sang Client dựa trên CRT bằng cách thay đổi phương thức xây dựng. Lưu ý rằng một số thiết lập có sẵn trong bộ xây dựng tiêu chuẩn có thể hiện không được hỗ trợ trong bộ xây dựng CRT.


Java
S3AsyncClient s3AsyncClient = 

       S3AsyncClient.crtBuilder()

                    .credentialsProvider(DefaultCredentialsProvider.create())

                    .region(Region.US_WEST_2)

                    .targetThroughputInGbps(20.0)

                    .minimumPartSizeInBytes(8 * MB)

                    .build();

Gọi API S3

Bạn có thể sử dụng khách hàng CRT-Based S3 để gọi bất kỳ API Amazon S3 nào. Trong phần tiếp theo, chúng tôi sẽ hướng dẫn bạn cách gọi PutObject và GetObject.


Java
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 Transfer Manager

Thêm phụ thuộc cho S3 Transfer Manager
Trước tiên, bạn cần bao gồm các phụ thuộc s3-transfer-manager và aws-crt trong dự án của bạn. Tìm kiếm trên kho lưu trữ Maven central để tìm phiên bản mới nhất của các thành phần s3-transfer-manager và aws-crt.\

XML
<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>

Khởi tạo S3 Transfer Manager
Bạn có thể khởi tạo Transfer Manager sử dụng các thiết lập mặc định bằng cách sử dụng đoạn mã sau.

JAVA
S3TransferManager transferManager = S3TransferManager.create();

Nếu bạn muốn cấu hình các thiết lập hoặc sử dụng một khách hàng S3 dựa trên CRT đã xây dựng trước đó, chúng tôi khuyến nghị sử dụng bộ thiết lập thay vì việc sử dụng builder:

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

Chuyển đổi một đối tượng duy nhất

Tải một tệp lên S3 và ghi lại tiến trình tải lên bằng một TransferListener.

Để tải lên một tệp vào Amazon S3, bạn cần cung cấp đường dẫn tệp nguồn và một PutObjectRequest xác định bucket và key đích. Tùy chọn, bạn có thể theo dõi tiến trình của quá trình chuyển bằng cách gắn một TransferListener. LoggingTransferListener được cung cấp sẽ ghi lại thanh tiến trình cơ bản; người dùng cũng có thể tự triển khai người nghe của riêng mình.

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


Tải một đối tượng S3 xuống một tệp cục bộ và ghi lại tiến trình tải xuống bằng một TransferListener.


Để tải xuống một đối tượng từ Amazon S3 vào một tệp cục bộ, bạn cần cung cấp đường dẫn tệp đích và một GetObjectRequest xác định bucket và key nguồn. Giống như việc tải lên, bạn có thể theo dõi tiến trình của quá trình chuyển bằng cách gắn một 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);
// Đợi quá trình chuyển hoàn thành
download.completionFuture().join();

Sao chép một đối tượng S3 từ một vị trí đến vị trí khác.


Để sao chép một đối tượng từ một vị trí này sang vị trí khác, bạn cần cung cấp một CopyObjectRequest với vị trí nguồn và đích.

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);
// Đợi quá trình chuyển hoàn thành
CompletedCopy completedCopy = copy.completionFuture().join();

Chuyển nhiều đối tượng trong cùng một thư mục

Tải một thư mục cục bộ lên một S3 bucket

Để tải một thư mục cục bộ đệ quy lên một S3 bucket, bạn cần cung cấp thư mục nguồn và bucket đích.


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

Tải các đối tượng S3 trong cùng một bucket xuống một thư mục cục bộ

Để tải tất cả các đối tượng S3 trong cùng một bucket, bạn cần cung cấp thư mục đích và bucket nguồn.

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

Kết luận

Trong bài đăng blog này, chúng tôi đã trình bày các tính năng quan trọng của khách hàng S3 dựa trên CRT và Trình quản lý chuyển S3 trong SDK AWS cho Java 2.x. Chúng tôi đã chỉ cho bạn cách sử dụng chúng để chuyển đổi các đối tượng. Để tìm hiểu thêm về cách thiết lập và bắt đầu sử dụng các tính năng này, hãy truy cập Hướng dẫn cho Nhà phát triển và Tài liệu tham khảo API của chúng tôi. Hãy thử ngay hôm nay và cho chúng tôi biết ý kiến của bạn! Bạn có thể liên hệ với chúng tôi bằng cách tạo một vấn đề trên kho lưu trữ GitHub của chúng tôi.

Xem bài viết gốc: https://aws.amazon.com/vi/blogs/developer/introducing-crt-based-s3-client-and-the-s3-transfer-manager-in-the-aws-sdk-for-java-2-x/