我有一个延迟的作业队列,其中包含特别慢的运行任务,我希望由其自己的一组专职工作人员来处理,因此它会降低其他工作流程瓶颈的风险。
RAILS_ENV=production script/delayed_job --queue=super_slow_stuff start
然而,我还希望为所有其他队列建立一个通用工作池,希望无需单独指定它们(因为它们的名称等经常被更改/添加)。类似于:
RAILS_ENV=production script/delayed_job --except-queue=super_slow_stuff start
我可以使用通配符*
字符,但我想这会导致第二个工作人员也能获得超级慢工作?
对此有何建议?
答案 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后端。