Delayed_job - 多个并行队列?

20

我正在使用delayed_job,并且已经迁移到了一台新的更强大的服务器。现在,我有了更多的能力,因此我想要运行并行作业,但我不确定delayed_job是否可以运行多个并行队列?

这个问题建议有命名队列,但是它们是否都从一个表中运行,因此是顺序的?

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

是否有人这样做过,并且可以指导我如何操作?


不,多个工作进程是并行而非顺序执行的。即使所有队列都在一个表中,工作进程也会使用 SQL 查询来选择分配给它的作业队列,并按 run_atpriority 排序。因此,多个工作进程可以并行处理该表中的不同部分。 - lulalala
我忘记了答案,所以我添加了我使用的内容并接受了它。我还给其他人点了赞... - slotishtype
3个回答

33

这是可能的,我一直在这样做。在我们的情况下,我们需要为处理三种不同类型的作业(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

每个命令都将创建一个延迟作业,因此现在有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个工作进程来处理任何作业。


你知不知道最后一个(为任何工作提供两个工人)会不会从其他队列(跟踪、邮件、任务)中获取工作,还是只有在未指定队列的情况下才会获取工作? - Machisuji
我认为这里需要进行更正以指定多个实例。语法应该是这样的:RAILS_ENV=production script/delayed_job --queue=queue_a -i one1 开始,注意-i和实例名称之间的空格。 - 3coins
谢谢,这个对我非常有效...谢谢!我还没有检查-n选项... - Gnana
应该注意,-i参数仅适用于--queue,并且不适用于--pool。 - Emiliano Della Casa
我已经在多个地方(“大约80个”)添加了延迟,现在我想使用queue为2个特定的工作人员添加新的延迟。如何实现而不会影响之前的延迟? - Vishwas Nahar

16

使用Bundler在生产环境中运行:

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

或者不使用Bundler:

ruby script/delayed_job -n 4 start


1
我还没有尝试过-i选项,但是当你指定队列时,-n选项似乎不起作用。你会得到多个工作进程,但只有一个工作进程会应用于实际线程。 - Dex
"-n 4" 这是一个大错误!请使用-n4,不要有空格!我浪费了几个小时在这上面。 - Andrew Rukin
@AndrewRukin,文档明确提到了“-n 2”(带有空格……)请参见此处:https://github.com/collectiveidea/delayed_job#running-jobs。 - rept
使用队列和延迟作业worker,是否可能只选择queue中的一个而不是其他空闲的workers - Vishwas Nahar

4
如果您使用rake任务作为启动机制,可以使用QUEUE环境变量来启动不同的工作任务并将它们分开排队。
示例:
QUEUE=email rake jobs:work
QUEUE=build_data rake jobs:work

QUEUES变量允许特定工作线程从多个DJ队列中出队。
QUEUES=build_data,email rake jobs:work

特别适用于使用托管/云环境(例如Heroku)的情况,这种环境只提供有限的直接启动脚本/作业的访问权限。

如果我将我的多个并行作业队列设置为以下内容:QUEUES=build_data,email rake jobs:work,然后是 QUEUE=another_data rake jobs:work,它就无法工作了。 - Peter Prabu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接