【发布时间】:2015-08-19 00:50:01
【问题描述】:
我在 Rails 应用程序中有以下任务要做:
- 下载视频
- 在给定持续时间(例如:00:02 - 00:09)之间使用 FFMPEG 修剪视频
- 将视频转换为给定格式
- 将转换后的视频移至文件夹
因为我想在后台作业中实现这一点,所以我使用了 1 个处理队列的 resque worker。
对于第一份工作,我创建了一个这样的队列
@queue = :download_video 完成了它的任务,在任务结束时,我将通过调用 Resque.enqueue(ConvertVideo, name, itemId) 继续下一个任务。通过这种方式,我创建了一个队列链,当一个任务完成时进入队列。
这是非常错误的,因为如果第一个作业开始将其他作业排入队列(一个从另一个作业),那么所有工作都会被 1 个工作人员阻塞,直到第一个排队作业列表完成。
这应该如何优化?我尝试将更多的工人添加到这种排队工作的方式中,但结果是错误的且不可预测的。
另一方面是每个作业都在数据库中保存一个状态,我需要以正确的顺序处理作业。
每个工人是否应该从上面做一项工作并且至少有 4 名工人?如果我将数量翻倍到 8 名工人,会不会有所改善?
【问题讨论】:
标签: ruby-on-rails background-process resque