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

Другие вопросы по тегам