[AWS] Uploading Large Files – S3 Multipart Upload

3 min read

Là những nhà phát triển phải tải lên các tệp lớn từ ứng dụng của mình lên đám mây, chúng ta có thể đối mặt với nhiều thách thức.

Amazon Simple Storage Service (Amazon S3) là một dịch vụ lưu trữ đối tượng lý tưởng cho chúng ta để lưu trữ các đối tượng lớn. Nó cung cấp cho chúng ta nhiều phương thức như tải lên, lấy, v.v.

Nếu chúng ta muốn tải lên các tệp trong các đợt nhỏ hơn, điều đó sẽ yêu cầu nhiều lần gọi fetch, update(file content), và upload của s3. Những lần gọi s3 nhiều lần này có thể dẫn đến trải nghiệm người dùng kém hoặc không nhất quán và mất dữ liệu trong trường hợp có lỗi khi thực hiện các lần gọi s3.

Một trong những giải pháp có thể giúp chúng ta tăng thông lượng và giảm thiểu các lần tải lại do lỗi là sử dụng S3 Multipart Upload.

https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html: [AWS] Uploading Large Files – S3 Multipart Upload

S3 MultipartUpload :

Multipart upload cho phép chúng ta tải lên một đối tượng đơn lẻ như một tập hợp các phần. Chúng ta có thể tải lên các phần của đối tượng này độc lập và theo bất kỳ thứ tự nào. Sau khi hoàn thành, S3 kết hợp các mảnh nhỏ hơn thành đối tượng lớn ban đầu.


Nói chung, khi kích thước đối tượng đạt 100 MB, chúng ta nên cân nhắc sử dụng multipart uploads thay vì tải lên đối tượng trong một lần hoạt động duy nhất. Nó cũng có thể phục hồi từ lỗi mạng nhanh hơn bằng cách chỉ khởi động lại việc tải lên cho các phần bị lỗi.

Performing Multipart Upload :

Step 1: Create an Amazon S3 Client

Đầu tiên trong quá trình là tạo một client Amazon S3 bằng AWS SDK cho Java. Dưới đây là một đoạn mã minh họa cho việc tạo client Amazon S3:

AmazonS3 amazonS3Client = AmazonS3ClientBuilder.standard()
.withRegion(Regions.AP_SOUTH_2)
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build()

Ở đây, bằng cách cung cấp access key và secret key, chúng ta đang tạo một Amazon S3 client cho khu vực Châu Á Thái Bình Dương (Hyderabad).

Step 2: Initiate Multipart Upload

Bằng cách sử dụng phương thức initiateMultipartUpload được cung cấp bởi AmazonS3 client, chúng ta sẽ khởi tạo một multipart upload cho một tệp bằng cách truyền khóa đối tượng và tên bucket được chỉ định làm tham số, như được hiển thị trong đoạn mã dưới đây.

InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest(bucketName, objectKey);
InitiateMultipartUploadResult initiateResponse = s3Client.initiateMultipartUpload(initRequest);

Step 3: Upload Parts

Sau đó là tải lên các phần của tệp bằng phương thức uploadPart được cung cấp bởi AmazonS3 client. Chúng ta có thể tải lên các phần của tệp như được minh họa trong đoạn mã ví dụ dưới đây:

long partSize = 5 * 1024 * 1024; // Setting part size of object to 5 MB.
File file = new File(filePath);
long fileLength = file.length();
long numOfParts = fileLength / partSize;
if (fileLength % partSize > 0) {
    numOfParts++;
}List<PartETag> partETags = new ArrayList<>();for (int i = 0; i < numOfParts; i++) {
    long start = i * partSize;
    long end = Math.min(start + partSize, fileLength);    UploadPartRequest uploadRequest = new UploadPartRequest()
            .withBucketName(bucketName)
            .withKey(objectKey)
            .withUploadId(initResponse.getUploadId())
            .withPartNumber(i + 1)
            .withFileOffset(start)
            .withPartSize(end - start)
            .withFile(file);    UploadPartResult uploadResult = s3Client.uploadPart(uploadRequest);
    partETags.add(uploadResult.getPartETag());
}

Ở đây, chúng ta đang đặt kích thước của từng phần là 5 MB và tải lên các phần của tệp song song. Chúng ta cũng lưu trữ các thẻ của từng phần trong một danh sách, danh sách này sẽ được sử dụng để hoàn thành việc tải lên multipart.

Step 4: Complete Multipart Upload

Bước cuối cùng là hoàn thành việc tải lên multipart bằng cách sử dụng phương thức complete multipart upload được cung cấp bởi AmazonS3 client. Chúng ta có thể hoàn thành việc tải lên multipart như sau:

CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(bucketName, objectKey, initResponse.getUploadId(), partETags);
CompleteMultipartUploadResult completeResponse = s3Client.completeMultipartUpload(compRequest);

Ở đây, chúng ta hoàn thành việc tải lên multipart bằng cách cung cấp tên bucket, khóa đối tượng, upload ID, và các thẻ ETag của từng phần.

Other Useful Methods Provided :

Cùng với các phương thức trên, dưới đây là một vài phương thức liên quan đến multipart upload mà có thể hữu ích:

  • Abort Multipart Upload — Hủy một multipart upload.
  • List Parts — Liệt kê các phần đã được tải lên cho một multipart upload cụ thể.
  • List Multipart Uploads — Liệt kê các multipart upload đang tiến hành.

Limitations :

Dưới đây là các giới hạn của Amazon S3 multipart upload:

Tham khảo thêm tài liệu tại: 

https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *