如果块中断,如何在 GCS 的可断点上传下将大文件作为分块请求发送?

问题描述 投票:0回答:2

背景

我正在开发一个在顶级云存储和存储桶上创建抽象的项目。然而,我遇到了一个问题,即如何最好地支持为 GCS 发送大文件。我们需要能够以块的形式发送大文件,并且我们希望能够控制以块的形式发送的缓冲区/流。

S3 具有分段上传功能,允许我们并行发送分块文件。不幸的是,GCS 不支持这一点,它们有“复合对象”,它允许我们并行发送文件。然而,复合对象有各种限制。例如,无法使用客户端加密、MD5 摘要、保留策略、必须手动清理临时文件等,这些都是有问题的,因为我们想要支持这些东西。 断点续传

根据文档,在 GCS 上发送大文件的推荐方式是通过

可断点续传

。我们的用例将以缓冲块的形式发送一个未知大小的大文件,因为我们知道每个块的大小以及块是否是最后一部分。根据我的理解,理想的情况是使用 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)]/
google-cloud-platform google-cloud-storage
2个回答
2
投票
)?

这要看情况。不需要使所有块大小相同,也不需要在上传开始时就决定它们,也不需要记住您发送的块。正如您在下面注意到的,需要发送除最后之外的所有块,其大小为 256KiB 的倍数。

回答您的问题:如果
(chunkSize-LastByte)

是 256KiB 的倍数,您可以将其作为新块发送,或者您可能需要将字节从

lastByte

发送到

lastByte + N * 256KiB

此外,可续传上传也有限制,即每个块必须是 256KB 的倍数。这是否意味着中断将导致块无法保持同步?

不。这意味着当您恢复上传时,块边界可能需要更改。

实践中

我认为GCS总是在256KiB的范围内提交,但我不相信有任何保证它总是会这样做。

与此同时,GCS 在其 XML API 中添加了对

Multipart Upload (MPU) API

0
投票

使用 MPU,您可以启动上传,将块(也称为部分)文件上传到存储桶的特殊隐藏区域,完成后将它们最终确定为一个对象。 单个分片文件上传不支持断点续传,但如果失败,您可以重新上传,因此请选择可以接受重传的分片文件大小。启动的分段上传将保持活动状态,直到完成或中止。您可以创建对象生命周期管理生命周期操作

AbortIncompleteMultipartUpload

来清理过时的上传。

Python 和 Node.js 的

GCS 客户端库
包含一个

transfer_manager

模块,负责处理并行上传和下载的详细信息;你只需给它一个块大小和工人数量,然后就可以了!对于其他语言,可以使用其他 S3 兼容库或直接调用 XML API。 有关优缺点的更多信息,请查看我最近的博客:

使用 Google Cloud Storage (GCS) 进行高吞吐量文件传输

© www.soinside.com 2019 - 2024. All rights reserved.