华为云 OBS 分段上传实战:大文件断点续传与并发控制
【摘要】 从分段上传的三步流程讲起,给出 Python SDK 示例,并总结分片大小、并发数、断点续传与未完成分片清理的实践要点。
为什么需要分段上传
对象存储服务 OBS 的单次 PUT 适合小文件;当文件达到 GB 级时,一旦网络抖动就要整份重传,失败成本很高。分段上传(Multipart Upload)把大文件拆成多个 part 分别上传,全部完成后由服务端合并,既支持断点续传,也能通过并发提升吞吐。
三步核心流程
分段上传由三个动作组成:初始化任务拿到 uploadId;按序号上传各个分片并记录 ETag;最后提交分片清单完成合并。任何一步失败都可以调用 abort 取消任务,避免残留分片继续计费。
from obs import ObsClient
client = ObsClient(access_key_id=ak, secret_access_key=sk, server=endpoint)
resp = client.initiateMultipartUpload(bucket, key)
upload_id = resp.uploadId
parts = []
for i, chunk in enumerate(chunks, start=1):
r = client.uploadPart(bucket, key, upload_id, i, chunk)
parts.append({'partNum': i, 'etag': r.body.etag})
client.completeMultipartUpload(bucket, key, upload_id, parts)
分片大小与并发
单个分片建议 8~16 MB,分片数上限为 10000,因此分片大小要随文件大小调整。并发数不是越大越好,需结合出口带宽与客户端内存,一般 4~8 路并发即可跑满千兆网络。分片太小会增加请求次数和合并开销,太大则失去断点续传的粒度。
断点续传怎么做
把 uploadId、已完成分片的序号与 ETag 持久化到本地数据库或配置文件。恢复时先查询已上传分片列表,只为缺失的序号补传,最后用完整清单提交。注意 ETag 必须原样带回,顺序也要与分片号一致。
别忘了清理未完成分片
未完成的分段上传会一直占用存储空间。建议在桶上配置生命周期规则,自动清理 N 天后仍未完成的分段任务;应用侧也要在异常分支调用 abortMultipartUpload,形成双保险。
小结
分段上传的关键不只是“切开传”,而是把 uploadId 与分片状态管理好:合理分片、适度并发、可恢复的断点记录,再加上生命周期兜底清理,才能让大文件上传稳定又可控。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)