【问题标题】:Delayed Job Queue, Priority, Worker延迟作业队列、优先级、工人
【发布时间】:2021-08-12 15:44:23
【问题描述】:

我的代码中有大约 10 个队列,每个队列都有单独的工作人员。所有都有默认优先级 - 1.

目前,来自用户 (UI) 和 rake 任务的请求在同一个队列中。假设,从用户和 rake 任务中获取数据的请求在同一个优先级为 1 的队列中,并且两者都根据请求时间一一执行。

但我想先运行来自用户的请求,然后再运行 rake 任务。我该如何管理?

我还想了解如果我为 rake 任务创建一个单独的队列并赋予它低优先级,那么它将如何工作。它会与其他队列一起运行还是等待它们先执行?

Delayed::Worker.queue_attributes = {
  high_priority: { priority: -10 },
  low_priority: { priority: 10 }
}

【问题讨论】:

  • 你能分享一下作业入队的代码吗?

标签: ruby-on-rails delayed-job


【解决方案1】:

本文可以进一步帮助您 - 它还提供了一些编码示例,您可以使用这些示例来尝试使用您自己的代码: https://phil.tech/2016/tips-on-sidekiq-queues/

基本上,如果您想首先运行来自用户的请求,您应该为他们创建一个队列并为其分配更高的优先级。无需指定-10,只需从0开始,逐步向上。

但也请记住,您不应拥有多个队列,因此将不同的优先级捆绑在一起可能是有意义的:

我不建议排队数量超过几个。大量队列使系统更加复杂,Sidekiq Pro 在没有轮询的情况下无法可靠地处理多个队列。 M Sidekiq Pro 进程轮询 N 个队列意味着每秒 O(M*N) 次操作对 Redis 的冲击。

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

最后,如果您的代码的一部分必须在另一部分之前运行,您还可以将 rake 任务从处理用户请求的作业中排入队列。

【讨论】:

  • 但这是给sidekiq-queues的,我正在寻找延迟作业库
【解决方案2】:

但我想先运行来自用户的请求,然后再运行 rake 任务。 我该如何管理?

建议将Delayed::Worker.default_priority改为正数,例如:5,然后在用户worker中定义一个priority方法返回一个较小的数字

class UserRequestJob < ApplicationJob
  def priority
    1 # lower numbers run first
  end
  ...
end

我也想了解我是否为 rake 任务创建一个单独的队列 & 给它低优先级,然后它是如何工作的。它会随着 另一个队列还是等待它们先执行?

它将首先运行优先级较高的作业,然后运行优先级较低的作业,实际上队列名称在作业入队后并不重要,除非您有dedicated workers,当您定义具有优先级的队列时:

Delayed::Worker.queue_attributes = {
  high_priority: { priority: -10 },
  low_priority: { priority: 10 }
}

然后您将作业排入队列,delayed_job 将通过队列名称获得优先级,如您在job_preparer.rb 中看到的那样

参考资料:

https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html
https://github.com/collectiveidea/delayed_job#named-queues

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2011-08-26
    • 2017-12-02
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多