如何处理 Goroutine 中的错误

我有一项用于将文件上传到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 个以上的文件怎么办?是否会因为请求太多而无法上传某些文件?


一只甜甜圈
浏览 127回答 3
3回答

红颜莎娜

问题是,当使用 goroutine 时,您会立即向客户端返回成功消息。如果确实如此,则意味着您的 goroutine 需要能够在上传到 S3 时发生错误时进行恢复(不要丢失图像)。因此,要么您处理这个问题,要么异步通知您的客户端上传失败,以便客户端可以重试。

牧羊人nacy

这个问题太宽泛,无法单一回答。一般来说,有以下三种可能的方法:等待您的 goroutine 完成以处理任何错误。确保你的 goroutine 可以处理(或者可能忽略)它们遇到的任何错误,这样返回错误就无关紧要了。让你的 goroutine 记录任何错误,以便稍后处理,可能由人类处理,也可能由某些清理/重试函数处理。哪种方法最好取决于具体情况。

HUWWW

对于任何异步任务 - 例如在后台 go 例程中上传文件 - 可以以将 a 返回chan error给调用者的方式编写上传函数。然后,调用者可以稍后通过读取chan error.但是,如果您接受上传请求,我建议您创建一个工作上传 go-routine,通过通道接受文件上传。输出“错误”通道可以跟踪成功/失败。如果需要,上传的错误可以写回原始上传通道队列(包括重试计数和重试最大值 - 因此有问题的有效负载不会永远循环)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go