【问题标题】:Sidekiq with a Worker who fetches jobs from two queuesSidekiq 与从两个队列中获取作业的 Worker
【发布时间】:2020-11-02 08:42:08
【问题描述】:

我希望 Worker 能够从两个队列中获取作业,每个队列具有不同的优先级。

现在,我的工人看起来像这样:

class OrderWorker
  include Sidekiq::Worker
  sidekiq_options retry: false, queue: :orders
end

但是我想要另一个队列具有更高优先级的订单,并让工作人员使用另一个队列。 Sidekiq 甚至可以做到这一点吗?如果是这样,在你做OrderWorker.perform_async(...)的时候,你如何指定哪个队列?

谢谢!

【问题讨论】:

  • @colinm 队列权重可以工作,只要我可以指定一个工作人员将使用两个队列。我有一个带有发送电子邮件队列的工作人员,但是我需要两个额外的订单队列。我只需要再增加一名工人来专注于这两个订单队列。
  • 这正是加权的工作原理。每次运行 sidekiq(无论是在传统 CLI 上还是通过 Procfile),您都在启动一个 worker。如果您在命令行上传递加权选项,它们只会影响传递给它们的一个工作人员。您可以指定单个工作人员处理任意数量的队列。
  • colinm,但是我如何将特定作业排入特定队列?通常你会做 MyWorker.perform_async(args)。你如何告诉它在一个特定的队列中排队?你能写一个例子作为答案,所以我可以接受吗?我认为这对你来说真的很清楚,但现在对我来说不是。
  • 我也有同样的问题。我希望一名工作人员同时处理高优先级和低优先级队列中的作业,并希望能够将特定作业排入特定队列。

标签: ruby-on-rails sidekiq


【解决方案1】:

您可以将queue 作为选项传递:

OrderWorker.perform_async(:queue => 'high')
OrderWorker.perform_async(:queue => 'default') # default is 'default' anyway

perform_asyncperform_in 调用方法 push,其中有一个 queue 参数。

【讨论】:

  • 这是否意味着我不必像in the docs 所述那样在工作代码中指定队列?
  • 未在工作线程中指定队列(例如:sidekiq_options queue: :high)会将其放入“默认”队列。将:queue=> 'high' 作为perform_async 的参数传递会覆盖sidekiq_options 之一。
  • 太棒了,谢谢!感谢push 代码的链接。
【解决方案2】:

说实话,我不知道 sidekiq 是否支持这一点,但如果是我,我可能会为此使用继承,因为它只是普通的 Ruby。

class OrderWorker
  include Sidekiq::Worker
end

class HighPriorityOrderWorker < OrderWorker
  sidekiq_options retry: false, queue: :high_priority_orders
end

class LowPriorityOrderWorker < OrderWorker
  sidekiq_options retry: false, queue: :low_priority_orders
end

【讨论】:

  • 我不知道这是否有效,您可能需要将包含行移动到子类中。
  • 但这意味着我需要声明两个工人(例如在 Heroku 中)。我只想让一名工作人员从两个队列中消费。只有一个队列的作业优先级高于另一个队列。
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 2018-09-27
  • 2014-12-03
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
相关资源
最近更新 更多