【发布时间】:2022-01-05 14:22:36
【问题描述】:
在我的 java 应用程序中,我需要将数据写入 S3,我事先不知道大小,而且大小通常很大,因此在 AWS S3 文档中建议我使用 Using the Java AWS SDKs (low-level-level API) 将数据写入s3 存储桶。
在我的应用程序中,我提供了 S3BufferedOutputStream,这是一个实现 OutputStream,应用程序中的其他类可以使用此流写入 s3 存储桶。
我将数据存储在缓冲区和循环中,一旦数据大于存储桶大小,我将数据作为单个 UploadPartRequest 上传到缓冲区中
这里是S3BufferedOutputStream的write方法的实现
@Override
public void write(byte[] b, int off, int len) throws IOException {
this.assertOpen();
int o = off, l = len;
int size;
while (l > (size = this.buf.length - position)) {
System.arraycopy(b, o, this.buf, this.position, size);
this.position += size;
flushBufferAndRewind();
o += size;
l -= size;
}
System.arraycopy(b, o, this.buf, this.position, l);
this.position += l;
}
整个实现类似这样:code repo
我这里的问题是每个UploadPartRequest都是同步完成的,所以我们要等一个part上传完才能上传下一个part。而且因为我使用的是 AWS S3 低级 API,我无法从 TransferManager 提供的并行上传中受益
有没有办法使用低级SDK实现并行上传? 或者可以进行一些代码更改以异步操作而不破坏上传的数据并保持数据的顺序?
【问题讨论】:
-
一开始为什么不能使用
TransferManager? -
@ErmiyaEskandary 因为我的应用程序要求,我需要能够将输出流公开给其他类(客户端)以写入 S3 存储桶。所以我需要我的 S3BufferedOutputStream 来处理大数据大小并且不需要将它存储在内存/临时文件中,而只是缓冲相当大的数量并异步写入
标签: java amazon-web-services amazon-s3 concurrency parallel-processing