获取 Google Cloud Storage 中对象的服务 URL

获取 Google Cloud Storage 中对象的服务 URL

我们有一个Golang在 AppEngine 上运行的应用程序,它使用以下包:

"cloud.google.com/go/storage"
apiStorage "google.golang.org/api/storage/v1"
"google.golang.org/appengine"
"google.golang.org/appengine/blobstore"
"google.golang.org/appengine/image"

常规工作流

  • 我们signed URL从 golang 应用程序中获取一个文件上传到 Google Cloud Storage
  • 我们PUT向该 URL 发送请求,将文件上传到 Google Cloud Storage 存储桶
  • 收到该请求的响应后,我们使用以下代码PUT检索:serving URL

代码

ctx := appengine.NewContext(r)
objectName := fmt.Sprintf("%s", "/gs/"+bucketID+"/"+objectID)
key, err := blobstore.BlobKeyForFile(ctx, objectName)
client, _ := storage.NewClient(ctx)
_ , error := client.Bucket(bucketID).Object(objectID).Attrs(ctx)
res, err := image.ServingURL(ctx,appengine.BlobKey(key),&image.ServingURLOptions{Secure: true})

我们遇到的问题是,这在 99% 的时间内都能正常工作(我们在 API 客户端中获得服务 URL),但在某些情况下我们会收到错误(如果我们在从请求写入和从请求到服务 URL 端点的读取API Error 8 - OBJECT_NOT_FOUND之间等待更长时间,则发生这种情况的频率会降低)。PUTGET

这是服务 URL 所期望的吗?我们可以采取什么解决方法/缓解措施来解决这个问题吗?

答案1

您使用的代码是正确的,但是当您调用 API 时,它会时不时地失败,这是正常的,就像它发生在您身上一样。

你可以做的是改进你的代码,将你的 API 调用包装成指数退避算法这是一种错误处理算法。使用此算法,请求之间的时间延迟会在每次请求失败时增加,然后再重试失败的请求。

还找到了不同的方法获取服务基准 URL,用户说它可以工作但我还没有尝试过,也许它对你有用。

相关内容