ActiveJob 是不是有具有特定优先级的队列?

Posted

技术标签:

【中文标题】ActiveJob 是不是有具有特定优先级的队列?【英文标题】:Does ActiveJob have queues with specific priority?ActiveJob 是否有具有特定优先级的队列? 【发布时间】:2015-12-05 12:00:19 【问题描述】:

查看下面的作业,我假设该作业在 low_priority 队列上运行。

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

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

从文档中我找不到任何表明我可以优先处理排队的作业的信息。我知道delayed_jobs 有这个功能,但是我在active_job 中没有找到。

【问题讨论】:

【参考方案1】:

优先级取决于实际的 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

【讨论】:

是的,这是有道理的,但delayed_job 和sidekiq 都支持队列和优先级,您可以在作业级别进行设置。如果您使用delayed_job 或sidekiq 适配器,活动作业是否支持此功能?听起来你在说是的......但没有任何文档真正有帮助。在发布此问题之前,我已经查看了您添加的参考资料,但我找不到任何东西......也许我遗漏了什么? 我明白这一点。我已阅读文档 - 我正在使用延迟作业,您可以在延迟作业上设置作业的优先级,例如 handle_asynchronously :send_mailer, :priority =&gt; 20。使用 sidekiq 我可以看到这是可能的,因为您在配置文件中设置了队列和优先级。延迟作业不会好像有这个。我的问题是如何使用 ActiveJob 的抽象来设置优先级……这可以通过 ActiveJob 实现还是我必须使用 delay_job?查看 ActiveJob 中的延迟作业适配器,这似乎是不可能的。我不确定还有什么要说的更清楚。 您不能以编程方式通过 ActiveJob 设置优先级。您只需将队列命名为“low_priority”或“high_priority”,并在程序中以这些名称使用它们。实际上,您无法从程序中控制“低”是否真的是“低”,而“高”是否真的是“高”优先级。它们只是名字。您可以为它们配置正确的权重(优先级)。 这就是我想要确认的。从我所看到的在 delay_job 之上使用 activejob 是不可能实际配置正确的权重?您只能在配置中设置默认权重。如果在delayed_job 之上使用activejob,则实际上无法设置每个作业或队列的权重,因为没有通过activejob 抽象的入口点。 由于这个问题似乎得到了一些点击,对于那些可能感兴趣的人,我编写了一些功能并将其合并到 DJ 中以实际处理优先级队列。这应该适用于带有 DJ 配置文件的 ActiveJob。 github.com/collectiveidea/delayed_job/pull/…

以上是关于ActiveJob 是不是有具有特定优先级的队列?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Delayed::Job 时使用 ActiveJob 设置优先级

Android中具有优先级队列的服务

Web - 消息队列

具有比较器的优先级队列未按预期工作

进程间通信->消息队列

有没有办法检查 Python 中的优先级队列中是不是存在优先级?