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