Golang 中断后如何恢复上传到 GCS?

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

在我的 Go 程序中,我正在将一个多 GB 的文件上传到 Google Cloud Storage (GCS)。我在这里使用客户端库:https://pkg.go.dev/cloud.google.com/go/storage

我的代码与文档中的示例类似。

r
是一个文件阅读器:

client, err := storage.NewClient(ctx)
if err != nil {
    return err
}
defer client.Close()
w := client.Bucket(l.Bucket).Object(fileName).NewWriter(ctx)
w.ContentType = ""
w.ACL = []storage.ACLRule{{Entity: storage.AllUsers, Role: storage.RoleReader}}

if _, err := io.Copy(w, r); err != nil {
    return err  // ########## Error is returned on this line! ##########
}
if err := w.Close(); err != nil {
    return err
}

小文件成功。但是,对于需要一个多小时才能上传的大文件,我的笔记本电脑会在上传完成之前进入睡眠状态。当我的笔记本电脑唤醒时,连接中断并返回以下错误(出于隐私考虑,我删除了 IP 地址):

read tcp x.x.x.x:ppp->X.X.X.X:PPP: read: connection reset by peer

相反,我想恢复上传。从 GCS 文档中,我看到支持断点续传 (https://cloud.google.com/storage/docs/resumable-uploads),但我不确定如何从 Go 客户端使用此功能。

最后一个重要细节:我不想从头开始重试上传。我想继续并保留中断之前的进度。

go google-cloud-platform google-cloud-storage
1个回答
0
投票

上传的“可恢复”部分仅在您的程序运行时有效。恢复所需的会话 URI 在内部使用并存储在内存中,因此您基本上可以在网络短暂中断的情况下恢复最后一个块的上传。

当使用的 HTTP 客户端放弃时(笔记本电脑进入睡眠状态后),您会收到错误并且会话丢失。

我在这里看到四个选项:

  1. 操纵HTTP客户端不放弃(不真正推荐)
  2. 使用
    gcloud
    二进制文件(python)
  3. 使用可恢复上传自行推出,将会话存储在某处
  4. 使用 签名 URL
  5. 自行推出

我建议使用签名 URL,但每种解决方案都有其优点和缺点。

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