Tenemos una Golang
aplicació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 URL
de la aplicación golang para cargar un archivo en Google Cloud Storage - Enviamos una
PUT
solicitud a esa URL para cargar el archivo en un depósito de Google Cloud Storage. - Al recibir la respuesta a esa
PUT
solicitud, recuperamosserving URL
usando 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 PUT
solicitud y la lectura de la GET
solicitud 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.