【发布时间】:2017-02-23 05:44:44
【问题描述】:
我们有一堆文件要在处理后上传到远程 blob 存储。
目前,前端 (PHP) 会创建此类文件的 redis 列表并为其提供唯一 ID,称为 JobID。然后,它将唯一 ID 传递给 beanstalk 管,由 Go 进程接收。它使用一个名为 Go workers 的库以 net/http 的方式处理每个作业 ID。它接收作业 ID,检索 redis 列表并开始处理文件。
但是,目前一次只处理一个文件。由于这里的操作是 I/O 限制的,而不是 CPU 限制的,直觉表明每个文件使用一个 goroutine 是有益的。
但是,我们希望在失败时重试上传,并跟踪每个作业处理的项目数。我们不能启动无限数量的 goroutine,因为单个 Job 可以包含大约 10k 个要处理的文件,并且在高峰时间每秒可以发送 100 个这样的 Job。正确的方法是什么?
注意:如果需要,我们可以稍微改变一下技术栈(比如用 beanstalkd 换一些东西)
【问题讨论】:
标签: asynchronous go redis beanstalkd