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 URL
Golangアプリケーションからファイルを取得し、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
間に待機時間が長ければ、エラーの発生頻度は低くなります)。PUT
GET
これはサービス URL から予想されるものですか? これに対して実施できる回避策や軽減策はありますか?
答え1
使用しているコードは正しいですが、API を呼び出すときに、あなたに起こっているように、時々失敗するのは正常です。
できることは、コードを改善して、API呼び出しを指数関数でラップすることです。バックオフアルゴリズムこれはエラー処理アルゴリズムです。このアルゴリズムを使用すると、リクエストが失敗するたびにリクエスト間に時間遅延が発生し、失敗したリクエストを再試行するまでの時間遅延が増加します。
また別の方法も見つけた配信ベースURLを取得するユーザーは動作していると言っていますが、私は試していません。おそらくあなたにとっては役に立つかもしれません。