[英]How to handle errors in a goroutine
我有一項用於將文件上傳到AWS S3的服務。 我試圖與 goroutines 一起使用而不上傳文件。 如果我在沒有 goroutines 的情況下上傳文件,它應該等到完成然后給出響應,如果我使用 goroutines,它將在后台運行並更快地響應客戶端。
如果我使用 goroutines 上傳失敗怎么辦? 然后那個文件沒有上傳到AWS S3 ? 你能告訴我如何處理這個嗎?
這是我的 function 上傳文件
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 個以上的文件怎么辦? 是否會因為請求過多而無法上傳某些文件?
這個問題太寬泛了,無法單獨回答。 從廣義上講,有三種可能的方法:
等待您的 goroutine 完成以處理任何錯誤。
確保您的 goroutine 可以處理(或可能忽略)它們遇到的任何錯誤,因此返回錯誤無關緊要。
讓你的 goroutine 記錄任何錯誤,以便以后處理,可能由人處理,或者可能由一些清理/重試 function。
哪種方法最好取決於具體情況。
問題是當使用 goroutine 時,您會立即向客戶端返回一條成功消息。 如果確實如此,則意味着您的 goroutine 在上傳到 S3 時需要能夠在出錯的情況下恢復(不要丟失圖像)。 因此,要么您處理好,要么異步通知您的客戶端上傳失敗,以便客戶端可以重試。
對於任何異步任務 - 例如在后台 go-routine 中上傳文件 - 可以編寫上傳 function 以向調用者返回chan error
。 然后,調用者可以稍后通過讀取chan error
來對文件上傳最終錯誤(或 nil 表示沒有錯誤)做出反應。
但是,如果您正在接受上傳請求,我建議改為創建一個工作上傳 go-routine,它通過通道接受文件上傳。 output“錯誤”通道可以跟蹤成功/失敗。 如果需要,可以將上傳的錯誤寫回原始上傳通道隊列(包括重試計數和重試最大值 - 因此有問題的有效負載不會永遠循環)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.