Назад | Перейти на главную страницу

Получение URL для обслуживания объекта в Google Cloud Storage

У нас есть 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"

Общий рабочий процесс

Код

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 обслуживания, который, по словам пользователя, работает, но я не пробовал, может быть, вам это пригодится.