Delayed_job - 多个并行队列?

Posted

技术标签:

【中文标题】Delayed_job - 多个并行队列?【英文标题】:Delayed_job - Multiple parallel queues? 【发布时间】:2012-03-17 18:28:50 【问题描述】:

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

This question 建议有命名队列,但是这些都运行在一张表之外并且因此是顺序的吗?

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

有没有人做过这个,他们能告诉我它是怎么做的吗?

【问题讨论】:

不,多个工作人员并行工作而不是顺序工作。即使队列都在一张表中,worker 也会使用 sql 查询来选择分配给它的作业队列,按run_atpriority 排序。因此,多个工作人员可以并行处理该表中的不同部分。 我忘记了答案,所以我添加了我使用的并接受了它。我也赞成另一个... 【参考方案1】:

这是可能的,我一直在这样做。在我们的例子中,我们需要多个作业来处理三种不同类型的作业,例如 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 个工作人员。

【讨论】:

您是否知道,如果最后一个(任何工作的 2 个工作人员)也会从其他队列(跟踪、邮件、任务)或仅没有指定队列的工作中获取工作? 我认为这里需要进行更正以指定多个实例。语法应该是这样 RAILS_ENV=production script/delayed_job --queue=queue_a -i one1 start,注意 -i 和实例名称之间的空格。 谢谢你,这个对我来说效果很好......谢谢!我还没有检查 -n 选项... 需要注意的是-i参数只对--queue有效,对--pool无效 我已经在多个地方添加了延迟(“大约 80”),我想使用 queue 为 2 个特定工作人员添加新的延迟,我如何在不添加 queue 的情况下实现其他延迟的。【参考方案2】:

在生产中使用捆绑器:

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

或者没有捆绑器

ruby script/delayed_job -n 4 start

【讨论】:

我没有尝试过 -i 选项,但是当您指定队列时 -n 选项似乎不起作用。您将让多个工作人员运行,但只有一个工作人员会应用于实际线程。 "-n 4" - 这是个大错误!使用-n4,没有空格!就这样浪费了几个小时。 @AndrewRukin 文档明确提到 -n 2 (带空格...)请参见此处:github.com/collectiveidea/delayed_job#running-jobs 这是否可以使用queue 和延迟工作worker 只选择queue 一个而不是另一个免费workers【参考方案3】:

如果您使用 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

以上是关于Delayed_job - 多个并行队列?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套GNU并行处理多个大文件并将每个文件数据拆分为队列

python并行编程

多线程面试题(2020)

多线程面试题(2020)

使用 Mandrill 邮件程序设计异步错误数量的参数(1 比 2)

并发与同步异步的概念