簡體   English   中英

如何處理 goroutine 中的錯誤

[英]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 個以上的文件怎么辦? 是否會因為請求過多而無法上傳某些文件?

這個問題太寬泛了,無法單獨回答。 從廣義上講,有三種可能的方法:

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

  2. 確保您的 goroutine 可以處理(或可能忽略)它們遇到的任何錯誤,因此返回錯誤無關緊要。

  3. 讓你的 goroutine 記錄任何錯誤,以便以后處理,可能由人處理,或者可能由一些清理/重試 function。

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

問題是當使用 goroutine 時,您會立即向客戶端返回一條成功消息。 如果確實如此,則意味着您的 goroutine 在上傳到 S3 時需要能夠在出錯的情況下恢復(不要丟失圖像)。 因此,要么您處理好,要么異步通知您的客戶端上傳失敗,以便客戶端可以重試。

對於任何異步任務 - 例如在后台 go-routine 中上傳文件 - 可以編寫上傳 function 以向調用者返回chan error 然后,調用者可以稍后通過讀取chan error來對文件上傳最終錯誤(或 nil 表示沒有錯誤)做出反應。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM