用 Python 给华为云 OBS 写一个断点续传上传器:分片、校验与重试
一、为什么需要断点续传
把几百 MB 的日志包或模型文件直接丢给普通上传接口,最大的问题不是速度,而是不可恢复:网络抖一下就从头再来。华为云 OBS 提供了分段上传(Multipart Upload)能力,把大文件切成固定大小的段分别上传,最后再合并成一个对象。只要把 uploadId 和每个分片的 ETag 持久化下来,进程被杀掉之后依然能接着传。
二、环境准备与初始化
依赖只有一个官方 SDK:pip install esdk-obs-python。初始化时把 AK/SK 放在环境变量里,代码中不要硬编码。客户端建议指定 endpoint 与 region,并打开长连接,这样连续上传多个分片时能省下大量 TLS 握手开销。如果 bucket 在别的区域,记得 endpoint 要和 bucket 所在区域一致,否则会报 301 重定向错误。
三、切片上传与进度记录
分段上传的第一步是调用 createMultipartUpload 拿到 uploadId,然后按 5MB 起步的分片大小循环调用 uploadPart。每上传成功一片,就把分片号、ETag 和字节范围写入本地的一个 JSON 断点文件,写文件时先写临时文件再改名,避免进程中断留下半个 JSON。进度条只需要读断点文件里已完成的字节数,不必依赖内存状态。
四、校验与失败重试
所有分片传完后调用 completeMultipartUpload,OBS 会按分片号顺序拼接。建议在上传前先算一遍文件的 CRC64 或 MD5,上传结束后用对象的 ETag 与元数据做一次比对,确认内容没有损坏。重试策略要区分错误类型:网络超时和 5xx 可以指数退避重试,4xx 特别是 403 通常是权限或签名问题,重试多少次都没用,应该直接抛出。
五、实测效果与小坑
用一个 1.2GB 的镜像包实测,千兆内网下总耗时和单次直传基本持平,但中途断网重连后只补传了缺失的两个分片,节省了将近九成的时间。踩过的坑有两个:一是分片号必须连续且从 1 开始,跳号会导致合并失败;二是未完成的分段上传会占用存储并计费,建议配一条生命周期规则自动清理超过七天的未完成分段上传。
- 点赞
- 收藏
- 关注作者
评论(0)