Wir haben eine Golang
Anwendung, 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 URL
von der Golang-Anwendung eine Anweisung zum Hochladen einer Datei in den Google Cloud Storage - Wir senden eine
PUT
Anfrage an diese URL, um die Datei in einen Google Cloud Storage-Bucket hochzuladen - Nach Erhalt der Antwort auf diese
PUT
Anfrage rufen wirserving URL
mit 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_FOUND
länger warten ).PUT
GET
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.