Obtendo um URL de veiculação para um objeto no Google Cloud Storage

Obtendo um URL de veiculação para um objeto no Google Cloud Storage

Temos uma Golangaplicação rodando no AppEngine, que utiliza os seguintes pacotes:

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

Fluxo de trabalho geral

  • Obtemos um signed URLaplicativo do golang para fazer upload de um arquivo para o Google Cloud Storage
  • Enviamos uma PUTsolicitação a esse URL para fazer upload do arquivo para um intervalo do Google Cloud Storage
  • Ao receber a resposta dessa PUTsolicitação, recuperamos a serving URLusando o seguinte 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})

O problema que estamos enfrentando é que isso funciona bem 99% das vezes (recebemos uma URL de serviço no cliente da API), mas há casos em que recebemos um erro API Error 8 - OBJECT_NOT_FOUND(o que acontece com menos frequência se esperarmos mais entre a gravação da PUTsolicitação e a leitura da GETsolicitação para o endpoint do URL de serviço).

Isso é esperado do URL de veiculação? Há alguma solução alternativa/mitigação que possamos implementar para isso?

Responder1

O código que você está usando está correto, mas é normal quando você chama uma API que ela falhe de vez em quando, como está acontecendo com você.

O que você pode fazer é melhorar seu código, agrupando sua chamada de API em um formato exponencial.algoritmo de esperaque é um algoritmo de tratamento de erros. Usando esse algoritmo, há um atraso entre as solicitações que aumenta cada vez que uma solicitação falha, antes de tentar novamente a solicitação com falha.

Também encontrei uma maneira diferente deobter URL base de veiculação, que o usuário diz que está funcionando mas ainda não tentei, talvez possa ser útil para você.

informação relacionada