У нас есть Golang
приложение, работающее на AppEngine, которое использует следующие пакеты:
"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"
signed URL
из приложения golang для загрузки файла в Google Cloud StoragePUT
запрос на этот URL для загрузки файла в корзину Google Cloud StoragePUT
запрос, мы получаем serving URL
используя следующий код: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})
Проблема, с которой мы сталкиваемся, заключается в том, что это работает нормально в 99% случаев (мы получаем URL-адрес обслуживания обратно в клиенте API), но есть случаи, когда мы возвращаем ошибку API Error 8 - OBJECT_NOT_FOUND
(что случается реже, если мы ждем больше между записью из PUT
запрос и чтение из GET
запрос к конечной точке URL-адреса обслуживания).
Ожидается ли это от URL-адреса обслуживания? Есть ли какие-то обходные пути / меры, которые мы могли бы применить для этого?
Код, который вы используете, правильный, но это нормально, когда вы вызываете API, что он время от времени дает сбой, как это происходит с вами.
Что вы можете сделать, так это улучшить свой код, заключив вызов API в экспоненциальную алгоритм отсрочки который представляет собой алгоритм обработки ошибок. При использовании этого алгоритма существует временная задержка между запросами, которая увеличивается каждый раз, когда запрос не выполняется, перед повторной попыткой неудачного запроса.
Также нашел другой способ получить базовый URL обслуживания, который, по словам пользователя, работает, но я не пробовал, может быть, вам это пригодится.