Obtener una URL de servicio para un objeto en Google Cloud Storage

Obtener una URL de servicio para un objeto en Google Cloud Storage

Tenemos una Golangaplicación ejecutándose en AppEngine, que utiliza los siguientes paquetes:

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

Flujo de trabajo general

  • Obtenemos un mensaje signed URLde la aplicación golang para cargar un archivo en Google Cloud Storage
  • Enviamos una PUTsolicitud a esa URL para cargar el archivo en un depósito de Google Cloud Storage.
  • Al recibir la respuesta a esa PUTsolicitud, recuperamos serving URLusando el siguiente código:

Código

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

El problema que tenemos es que esto funciona bien el 99% de las veces (obtenemos una URL de servicio en el cliente API), pero hay casos en los que obtenemos un error API Error 8 - OBJECT_NOT_FOUND(lo que ocurre con menos frecuencia si esperamos más). entre la escritura de la PUTsolicitud y la lectura de la GETsolicitud al punto final de la URL de servicio).

¿Se espera eso de la URL de servicio? ¿Existe alguna solución o mitigación que podamos implementar para esto?

Respuesta1

El código que estás usando es correcto pero es normal que cuando llamas a una API falle de vez en cuando, como te está pasando a ti.

Lo que puedes hacer es mejorar tu código, envolviendo tu llamada API en una forma exponencial.algoritmo de retrocesoque es un algoritmo de manejo de errores. Al utilizar este algoritmo, hay un retraso de tiempo entre las solicitudes que aumenta cada vez que falla una solicitud, antes de volver a intentar la solicitud fallida.

También encontré una forma diferente deobtener URL base de servicio, que el usuario dice que está funcionando pero no lo he probado, tal vez te pueda ser útil.

información relacionada