ActiveJob有特定优先级队列吗?

10

看下面的工作,我会假设该工作在一个low_priority队列上运行。

class GuestsCleanupJob < ActiveJob::Base
  queue_as :low_priority
  #....
end

我同意这一点,但这只是队列的名称对吗?它实际上与优先级无关。例如,如果我创建了一个命名为:my_queue的作业,它将被视为具有与:low_priority队列相同的优先级。

根据文档,我还没有找到任何表明我可以设置排队的作业优先级的内容。我知道delayed_jobs有此功能,但我在active_job中没有找到它。

1个回答

6

优先级取决于实际的 QueueAdapter 和该适配器的配置方式。如果您的适配器不支持优先级或未正确配置,则 ActiveJob 也无法帮助您。

从这里了解更多关于适配器的详细信息:

http://edgeapi.rubyonrails.org/classes/ActiveJob/QueueAdapters.html

最重要的是:

主要的一点是确保所有的 Rails 应用都有一个工作基础架构,然后我们可以让框架功能和其他 gem 建立在此基础之上,而不必担心不同工作运行程序之间的 API 差异,如 Delayed Job 和 Resque。选择你的队列后端变得更多的是操作上的考虑。您将能够在不重写作业的情况下在它们之间切换。

队列配置(包括优先级)成为适配器的责任。

作为队列配置的示例,请参阅 Sidekiq wiki:

https://github.com/mperham/sidekiq/wiki/Advanced-Options#queues


2
是的,这很有道理,但是delayed_job和sidekiq都支持队列和优先级,并且您可以在作业级别上设置它们。如果您正在使用delayed_job或sidekiq适配器,那么active job是否支持此功能?听起来您是在说是的...但实际上没有任何文档可以帮助我。在发布此问题之前,我已经查看了您添加的参考资料,但我找不到任何东西...也许我漏掉了什么? - Ryan-Neal Mes
2
我明白了。我已经阅读了文档 - 我正在使用delayed_jobs,你可以在delayed_job上设置作业的优先级,例如 handle_asynchronously :send_mailer, :priority => 20。对于sidekiq,我可以看到它是可能的,因为你可以在配置文件中设置队列和优先级。Delayed job似乎没有这个功能。我的问题是如何使用ActiveJob这个抽象层来设置优先级...是否可以通过ActiveJob实现,还是必须使用delayed_job?查看ActiveJob中的delayed_job适配器,似乎不可能实现这一点。我不确定还有什么其他的话可以更清楚地表达。 - Ryan-Neal Mes
3
您无法通过ActiveJob程序设置优先级。您只需将您的队列命名为“low_priority”或“high_priority”,并在您的程序中使用这些名称。实际上,您无法从程序中控制“low”是否真正是“低”优先级,“high”是否真正是“高”优先级。它们只是名称。关于正确的权重(优先级)配置,取决于您。 - dimakura
2
太好了,这正是我想要确认的。从我的观察来看,在delayed_job之上使用activejob,实际上不可能正确配置权重,对吗?您只能在配置中设置默认权重。如果使用activejob在delayed_job之上,因为没有通过抽象层级的activejob入口点,所以您无法实际设置作业或队列的加权值。 - Ryan-Neal Mes
2
由于这个问题似乎得到了一些关注,对于那些可能会感兴趣的人,我编写了一些功能,并将其合并到 DJ 中,以实际处理具有优先级的队列。这应该使用带有 DJ 配置文件的 ActiveJob 正常工作。https://github.com/collectiveidea/delayed_job/pull/845#issuecomment-178173963 - Ryan-Neal Mes
显示剩余2条评论

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