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

Получение 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"

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

  • Мы получаем signed URLиз приложения golang для загрузки файла в Google Cloud Storage
  • Мы отправляем PUTзапрос на этот URL-адрес для загрузки файла в хранилище Google Cloud Storage.
  • Получив ответ на этот PUTзапрос, мы извлекаем его, 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-адреса обслуживания? Есть ли какие-либо обходные пути/смягчения, которые мы могли бы применить для этого?

решение1

Код, который вы используете, правильный, но нормально, что при вызове API время от времени происходят сбои, как это происходит у вас.

Что вы можете сделать, так это улучшить свой код, заключив вызов API в экспоненциальныйалгоритм отсрочкичто является алгоритмом обработки ошибок. При использовании этого алгоритма между запросами существует задержка, которая увеличивается каждый раз, когда запрос не выполняется, перед повторной попыткой выполнить невыполненный запрос.

Также нашел другой способполучить URL-адрес обслуживающей базы, который, по словам пользователя, работает, но я не пробовал, возможно, он может быть вам полезен.

Связанный контент