我们有一个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
之间等待更长时间,则发生这种情况的频率会降低)。PUT
GET
这是服务 URL 所期望的吗?我们可以采取什么解决方法/缓解措施来解决这个问题吗?
答案1
您使用的代码是正确的,但是当您调用 API 时,它会时不时地失败,这是正常的,就像它发生在您身上一样。
你可以做的是改进你的代码,将你的 API 调用包装成指数退避算法这是一种错误处理算法。使用此算法,请求之间的时间延迟会在每次请求失败时增加,然后再重试失败的请求。
还找到了不同的方法获取服务基准 URL,用户说它可以工作但我还没有尝试过,也许它对你有用。