Temos uma Golang
aplicaçã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 URL
aplicativo do golang para fazer upload de um arquivo para o Google Cloud Storage - Enviamos uma
PUT
solicitação a esse URL para fazer upload do arquivo para um intervalo do Google Cloud Storage - Ao receber a resposta dessa
PUT
solicitação, recuperamos aserving URL
usando 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 PUT
solicitação e a leitura da GET
solicitaçã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ê.