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
Google Cloud Storage에 파일을 업로드하기 위해 golang 애플리케이션에서 가져옵니다.PUT
Google Cloud Storage 버킷에 파일을 업로드하기 위해 해당 URL로 요청을 보냅니다.- 해당 요청에 대한 응답을 받으면 다음 코드를 사용하여
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%의 경우 잘 작동하지만(API 클라이언트에서 제공 URL을 다시 얻음) 오류가 반환되는 경우가 있다는 것입니다 API Error 8 - OBJECT_NOT_FOUND
(더 기다리면 발생 빈도가 줄어듭니다). 요청 에서 쓰기 와 제공 URL 엔드포인트에 대한 요청 PUT
에서 읽기 사이).GET
제공 URL에서 예상되는 내용인가요? 이에 대해 우리가 시행할 수 있는 해결 방법/완화 조치가 있습니까?
답변1
사용하고 있는 코드는 정확하지만 API를 호출할 때 가끔 실패하는 것은 정상입니다.
당신이 할 수 있는 일은 API 호출을 지수적으로 래핑하여 코드를 개선하는 것입니다.백오프 알고리즘오류 처리 알고리즘입니다. 이 알고리즘을 사용하면 실패한 요청을 다시 시도하기 전에 요청이 실패할 때마다 증가하는 요청 간 시간 지연이 있습니다.
또한 다른 방법을 찾았습니다.제공 기본 URL 가져오기, 사용자가 작동 중이라고 했지만 저는 시도하지 않았습니다. 어쩌면 유용할 수도 있습니다.