亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理 Goroutine 中的錯誤

如何處理 Goroutine 中的錯誤

Go
一只甜甜圈 2023-07-31 15:13:29
我有一項用于將文件上傳到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 時發生錯誤時進行恢復(不要丟失圖像)。因此,要么您處理這個問題,要么異步通知您的客戶端上傳失敗,以便客戶端可以重試。



查看完整回答
反對 回復 2023-07-31
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

這個問題太寬泛,無法單一回答。一般來說,有以下三種可能的方法:

  1. 等待您的 goroutine 完成以處理任何錯誤。

  2. 確保你的 goroutine 可以處理(或者可能忽略)它們遇到的任何錯誤,這樣返回錯誤就無關緊要了。

  3. 讓你的 goroutine 記錄任何錯誤,以便稍后處理,可能由人類處理,也可能由某些清理/重試函數處理。

哪種方法最好取決于具體情況。


查看完整回答
反對 回復 2023-07-31
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

對于任何異步任務 - 例如在后臺 go 例程中上傳文件 - 可以以將 a 返回chan error給調用者的方式編寫上傳函數。然后,調用者可以稍后通過讀取chan error.

但是,如果您接受上傳請求,我建議您創建一個工作上傳 go-routine,通過通道接受文件上傳。輸出“錯誤”通道可以跟蹤成功/失敗。如果需要,上傳的錯誤可以寫回原始上傳通道隊列(包括重試計數和重試最大值 - 因此有問題的有效負載不會永遠循環)。


查看完整回答
反對 回復 2023-07-31
  • 3 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號