延迟作业排除队列

时间:2017-06-28 17:02:15

标签: ruby-on-rails delayed-job

我有一个延迟的作业队列,其中包含特别慢的运行任务,我希望由其自己的一组专职工作人员来处理,因此它会降低其他工作流程瓶颈的风险。

RAILS_ENV=production script/delayed_job --queue=super_slow_stuff start

然而,我还希望为所有其他队列建立一个通用工作池,希望无需单独指定它们(因为它们的名称等经常被更改/添加)。类似于:

RAILS_ENV=production script/delayed_job --except-queue=super_slow_stuff start

我可以使用通配符*字符,但我想这会导致第二个工作人员也能获得超级慢工作?

对此有何建议?

2 个答案:

答案 0 :(得分:1)

您可以为所有队列定义应用的全局常量。

QUEUES={
  mailers: 'mailers',
  etc..
}

然后在你的延迟方法调用中使用此常量

object.delay(queue: QUEUES[:mailers]).do_something

并尝试以dinamically方式构建delayed_job_args

system("RAILS_ENV=production script/delayed_job --pool=super_slow_stuff --pool:#{(QUEUES.values-[super_slow_stuff]).join(',')}:number_of_workers start")

答案 1 :(得分:1)

不幸的是,此功能在延迟的工作中无法实现。
看到:
https://github.com/collectiveidea/delayed_job/pull/466
https://github.com/collectiveidea/delayed_job/pull/901

您可以分叉延迟的作业存储库并应用https://github.com/collectiveidea/delayed_job/pull/466中的简单补丁。
然后使用你的GitHub仓库,但请投票到https://github.com/collectiveidea/delayed_job/pull/466,使其最终合并到上游。

<强>更新 我写了为自己排除队列的选项。它在(exclude_queues)分支中:https://github.com/one-more-alex/delayed_job/tree/exclude_queues
https://github.com/one-more-alex/delayed_job_active_record/tree/exclude_queues

Readme.md中包含的选项说明

关于排除的部分。

# Option --exclude-specified-queues will do inverse of queues processing by skipping onces from --queue, --queues.
# If both --pool=* --exclude-specified-queues given, no exclusions will by applied on "*".
If EXCLUDE_SPECIFIED_QUEUES set to YES, then queues defined by QUEUE, QUEUES will be skipped instead. See opton --exclude-specified-queues description for specal case of queue "*"

如果严格回答问题,普通工人的召唤将是:

RAILS_ENV=production script/delayed_job --queue=super_slow_stuff --exclude-specified-queues start

警告
请不要,这不会支持DelayedJobs和代码“按原样”放置,希望它有用。 我https://github.com/collectiveidea/delayed_job/pull/1019

提出了相应的拉取请求

同样适用于Active Record后端:https://github.com/collectiveidea/delayed_job_active_record/pull/151

仅支持ActiveRecord后端。