为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理 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条经验 获得超12个赞

问题是,当使用 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 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信