我有一項用于將文件上傳到AWS S3 的服務。我試圖與 goroutine 一起使用而不上傳文件。如果我上傳沒有 goroutine 的文件,它應該等到完成然后給出響應,如果我使用 goroutine 它將在后臺運行并且更快地響應客戶端。如果我使用 goroutine 上傳失敗怎么辦?然后那個文件沒有上傳到AWS S3?你能告訴我如何處理這個問題嗎?這是我上傳文件的功能func uploadToS3(s *session.Session, size int64, name string , buffer []byte)( string , error) { tempFileName := "pictures/" + bson.NewObjectId().Hex() + "-" + filepath.Base(name) _, err := s3.New(s).PutObject(&s3.PutObjectInput{ Bucket: aws.String("myBucketNameHere"), Key: aws.String(tempFileName), ACL: aws.String("public-read"), Body: bytes.NewReader(buffer), ContentLength: aws.Int64(int64(size)), ContentType: aws.String(http.DetectContentType(buffer)), ContentDisposition: aws.String("attachment"), ServerSideEncryption: aws.String("AES256"), StorageClass: aws.String("INTELLIGENT_TIERING"), }) if err != nil { return "", err } return tempFileName, err}func UploadFile(db *gorm.DB) func(c *gin.Context) { return func(c *gin.Context) { file, err := c.FormFile("file") f, err := file.Open() if err != nil { fmt.Println(err) } defer f.Close() buffer := make([]byte, file.Size) _, _ = f.Read(buffer) s, err := session.NewSession(&aws.Config{ Region: aws.String("location here"), Credentials: credentials.NewStaticCredentials( "id", "key", "", ), }) if err != nil { fmt.Println(err) } go uploadToS3(s, file.Size, file.Filename, buffer) c.JSON(200, fmt.Sprintf("Image uploaded successfully")) }}我也在想,如果有很多請求每 5-10 分鐘上傳超過 10000 個以上的文件怎么辦?是否會因為請求太多而無法上傳某些文件?
3 回答

紅顏莎娜
TA貢獻1842條經驗 獲得超13個贊
問題是,當使用 goroutine 時,您會立即向客戶端返回成功消息。如果確實如此,則意味著您的 goroutine 需要能夠在上傳到 S3 時發生錯誤時進行恢復(不要丟失圖像)。因此,要么您處理這個問題,要么異步通知您的客戶端上傳失敗,以便客戶端可以重試。

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
這個問題太寬泛,無法單一回答。一般來說,有以下三種可能的方法:
等待您的 goroutine 完成以處理任何錯誤。
確保你的 goroutine 可以處理(或者可能忽略)它們遇到的任何錯誤,這樣返回錯誤就無關緊要了。
讓你的 goroutine 記錄任何錯誤,以便稍后處理,可能由人類處理,也可能由某些清理/重試函數處理。
哪種方法最好取決于具體情況。

HUWWW
TA貢獻1874條經驗 獲得超12個贊
對于任何異步任務 - 例如在后臺 go 例程中上傳文件 - 可以以將 a 返回chan error
給調用者的方式編寫上傳函數。然后,調用者可以稍后通過讀取chan error
.
但是,如果您接受上傳請求,我建議您創建一個工作上傳 go-routine,通過通道接受文件上傳。輸出“錯誤”通道可以跟蹤成功/失敗。如果需要,上傳的錯誤可以寫回原始上傳通道隊列(包括重試計數和重試最大值 - 因此有問題的有效負載不會永遠循環)。
- 3 回答
- 0 關注
- 159 瀏覽
添加回答
舉報
0/150
提交
取消