我正在开发一个在顶级云存储和存储桶上创建抽象的项目。然而,我遇到了一个问题,即如何最好地支持为 GCS 发送大文件。我们需要能够以块的形式发送大文件,并且我们希望能够控制以块的形式发送的缓冲区/流。
S3 具有分段上传功能,允许我们并行发送分块文件。不幸的是,GCS 不支持这一点,它们有“复合对象”,它允许我们并行发送文件。然而,复合对象有各种限制。例如,无法使用客户端加密、MD5 摘要、保留策略、必须手动清理临时文件等,这些都是有问题的,因为我们想要支持这些东西。 断点续传
。我们的用例将以缓冲块的形式发送一个未知大小的大文件,因为我们知道每个块的大小以及块是否是最后一部分。根据我的理解,理想的情况是使用 content-range=[offset-(offset+chunkSize)]/*
和变量 chunkSize 发送前 N-1 个块,并将最后一个块发送为
content-range=[offset-(offset + remainingSize)]/[TOTAL_SIZE]
。我的问题是,如果块上传中断怎么办?
恢复块的中断上传
是什么意思?我们是发送当前块的剩余字节 (content-range=[lastByte-(chunkSize-lastByte)]/*
) 还是将其与下一个块 (content-range=[lastByte-(chunkSize-lastByte)+chunkSize]/*
) 一起发送?
此外,可续传上传也有限制,即每个块必须是 256KB 的倍数。这是否意味着中断会导致块无法保持同步?因此,可恢复上传的中断是否会导致剩余块动态发送直到最后一个块,而不是期望块具有常规内容范围
content-range=[offset-(offset+chunkSize)]/*
?
非常感谢。
恢复中断的块上传是什么意思?我们是发送当前块的剩余字节 (content-range=[lastByte-(chunkSize-lastByte)]/
这要看情况。不需要使所有块大小相同,也不需要在上传开始时就决定它们,也不需要记住您发送的块。正如您在下面注意到的,需要发送除最后之外的所有块,其大小为 256KiB 的倍数。
回答您的问题:如果
(chunkSize-LastByte)
是 256KiB 的倍数,您可以将其作为新块发送,或者您可能需要将字节从
lastByte
发送到
lastByte + N * 256KiB
此外,可续传上传也有限制,即每个块必须是 256KB 的倍数。这是否意味着中断将导致块无法保持同步?
不。这意味着当您恢复上传时,块边界可能需要更改。实践中在
我认为GCS总是在256KiB的范围内提交,但我不相信有任何保证它总是会这样做。
与此同时,GCS 在其 XML API 中添加了对
Multipart Upload (MPU) API使用 MPU,您可以启动上传,将块(也称为部分)文件上传到存储桶的特殊隐藏区域,完成后将它们最终确定为一个对象。 单个分片文件上传不支持断点续传,但如果失败,您可以重新上传,因此请选择可以接受重传的分片文件大小。启动的分段上传将保持活动状态,直到完成或中止。您可以创建对象生命周期管理生命周期操作
AbortIncompleteMultipartUpload
来清理过时的上传。
Python 和 Node.js 的
GCS 客户端库包含一个
transfer_manager
模块,负责处理并行上传和下载的详细信息;你只需给它一个块大小和工人数量,然后就可以了!对于其他语言,可以使用其他 S3 兼容库或直接调用 XML API。 有关优缺点的更多信息,请查看我最近的博客:
使用 Google Cloud Storage (GCS) 进行高吞吐量文件传输。