Delayed_job - 多个并行队列?

时间:2012-02-28 09:23:48

标签: ruby ruby-on-rails-3 ruby-on-rails-3.1 delayed-job

我正在使用delayed_job并转移到一个新的更强大的服务器。所以现在我想运行并行作业,就像现在I have the POWER!一样,但是对于delayed_job是否可以运行多个并行队列感到困惑?

This question建议有命名的队列,但这些都是从一个表中运行的,因此是顺序的吗?

在底部@Jesse Wolgamott建议您可以为每个队列创建一个表,然后以并行方式运行。

有没有人这样做过,他们能指出我是如何做到的吗?

3 个答案:

答案 0 :(得分:31)

这是可能的,而且我一直这样做。在我们的例子中,我们需要多个作业来处理三种不同的作业,例如queue_a,queue_b和queue_c。系统将在delayed_job表中创建条目,并且队列命名相应。

启动多个延迟的作业,例如

RAILS_ENV=production script/delayed_job -i first --queue=queue_a start
RAILS_ENV=production script/delayed_job -i second --queue=queue_a start
RAILS_ENV=production script/delayed_job -i third --queue=queue_b  start
RAILS_ENV=production script/delayed_job -i fourth --queue=queue_c start

每个命令都会创建一个delayed_job,因此现在将有4个并行作业,其中两个服务于queue_a,另一个用于queue_b和queue_c。这里的关键是通过-i选项传递的标识符,它指定实例名称,我们可以根据需要启动和停止作业。

另一个选择是使用工作池。

RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start

该命令将为跟踪队列启动1名工作人员,为邮件程序和任务队列启动2名工作人员,为任何工作启动2名工作人员。

答案 1 :(得分:12)

在生产中使用捆绑包:

RAILS_ENV=production bundle exec script/delayed_job -n 4 start

或没有捆绑

ruby script/delayed_job -n 4 start

答案 2 :(得分:3)

如果您使用rake任务作为作业启动机制,则可以使用QUEUE环境变量启动由队列分隔的不同工作程序作业。

示例:

QUEUE=email rake jobs:work
QUEUE=build_data rake jobs:work

QUEUES变量允许一个队列从特定工作人员的多个DJ队列中出发。

QUEUES=build_data,email rake jobs:work

如果您使用的是托管/云环境(例如Heroku),则可以直接启用脚本/作业,从而特别有用。