我們有一個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),但在某些情況下我們會得到一個錯誤API Error 8 - OBJECT_NOT_FOUND
(如果我們等待更長時間,這種情況發生的頻率就會降低)請求寫入PUT
和請求讀取GET
到服務 URL 端點之間)。
這是服務 URL 所期望的嗎?我們是否可以為此採取任何解決方法/緩解措施?
答案1
您使用的程式碼是正確的,但是當您呼叫 API 時,它不時失敗是正常的,就像發生在您身上一樣。
你能做的就是改進你的程式碼,將你的 API 呼叫包裝成指數形式退避演算法這是一種錯誤處理演算法。使用此演算法,在重試失敗的請求之前,請求之間會存在時間延遲,每次請求失敗都會增加時間延遲。
還找到了不一樣的方法取得服務基址 URL,用戶說它有效,但我還沒有嘗試過,也許它對你有用。