Google Cloud Storage 内のオブジェクトの配信 URL を取得する

Google Cloud Storage 内のオブジェクトの配信 URL を取得する

AppEngine 上で実行されているアプリケーションではGolang、次のパッケージが使用されます。

"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 URLGolangアプリケーションからファイルを取得し、Google Cloud Storageにアップロードします。
  • そのURLにリクエストを送信してPUT、ファイルを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を取得するユーザーは動作していると言っていますが、私は試していません。おそらくあなたにとっては役に立つかもしれません。

関連情報