我有一项用于将文件上传到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 时发生错误时进行恢复(不要丢失图像)。因此,要么您处理这个问题,要么异步通知您的客户端上传失败,以便客户端可以重试。
牧羊人nacy
TA贡献1862条经验 获得超7个赞
这个问题太宽泛,无法单一回答。一般来说,有以下三种可能的方法:
等待您的 goroutine 完成以处理任何错误。
确保你的 goroutine 可以处理(或者可能忽略)它们遇到的任何错误,这样返回错误就无关紧要了。
让你的 goroutine 记录任何错误,以便稍后处理,可能由人类处理,也可能由某些清理/重试函数处理。
哪种方法最好取决于具体情况。
HUWWW
TA贡献1874条经验 获得超12个赞
对于任何异步任务 - 例如在后台 go 例程中上传文件 - 可以以将 a 返回chan error
给调用者的方式编写上传函数。然后,调用者可以稍后通过读取chan error
.
但是,如果您接受上传请求,我建议您创建一个工作上传 go-routine,通过通道接受文件上传。输出“错误”通道可以跟踪成功/失败。如果需要,上传的错误可以写回原始上传通道队列(包括重试计数和重试最大值 - 因此有问题的有效负载不会永远循环)。
- 3 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消