Abrufen einer Bereitstellungs-URL für ein Objekt in Google Cloud Storage

Abrufen einer Bereitstellungs-URL für ein Objekt in Google Cloud Storage

Wir haben eine GolangAnwendung, die auf AppEngine läuft und die folgenden Pakete verwendet:

"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"

Allgemeiner Arbeitsablauf

  • Wir erhalten signed URLvon der Golang-Anwendung eine Anweisung zum Hochladen einer Datei in den Google Cloud Storage
  • Wir senden eine PUTAnfrage an diese URL, um die Datei in einen Google Cloud Storage-Bucket hochzuladen
  • Nach Erhalt der Antwort auf diese PUTAnfrage rufen wir serving URLmit dem folgenden Code eine ab:

Code

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})

Unser Problem besteht darin, dass dies in 99 % der Fälle problemlos funktioniert (wir erhalten im API-Client eine Bereitstellungs-URL zurück), es jedoch Fälle gibt, in denen wir einen Fehler zurückerhalten (was seltener vorkommt, wenn wir zwischen dem Schreiben aus der Anforderung und dem Lesen aus der Anforderung zum Bereitstellungs-URL-Endpunkt API Error 8 - OBJECT_NOT_FOUNDlänger warten ).PUTGET

Ist das von der bereitgestellten URL zu erwarten? Gibt es Workarounds/Abhilfemaßnahmen, die wir hierfür implementieren könnten?

Antwort1

Der von Ihnen verwendete Code ist korrekt, aber es ist normal, dass beim Aufrufen einer API von Zeit zu Zeit Fehler auftreten, so wie es bei Ihnen der Fall ist.

Was Sie tun können, ist, Ihren Code zu verbessern, indem Sie Ihren API-Aufruf in eine Exponentialfunktion einbinden.Backoff-AlgorithmusDabei handelt es sich um einen Fehlerbehandlungsalgorithmus. Bei diesem Algorithmus gibt es eine Zeitverzögerung zwischen den Anforderungen, die sich bei jedem Fehlschlag einer Anforderung erhöht, bevor die fehlgeschlagene Anforderung erneut versucht wird.

Habe auch einen anderen Weg gefunden,Basis-URL für die Bereitstellung abrufen, von dem der Benutzer sagt, dass es funktioniert, aber ich habe es nicht ausprobiert, vielleicht ist es für Sie nützlich.

verwandte Informationen