首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟的作业队列、优先级、工作进程

延迟的作业队列、优先级、工作进程
EN

Stack Overflow用户
提问于 2020-11-27 15:01:15
回答 2查看 303关注 0票数 1

我的代码中大约有10个队列,每个队列都有单独的工作进程。所有这些都具有默认优先级- 1。

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

但是我想先运行来自user的请求&然后运行rake任务。我该如何管理它呢?

我还想知道,如果我为rake任务创建一个单独的队列&赋予它低优先级,那么它将如何工作。它将与另一个队列一起运行,还是等待它们首先执行?

代码语言:javascript
复制
Delayed::Worker.queue_attributes = {
  high_priority: { priority: -10 },
  low_priority: { priority: 10 }
}
EN

回答 2

Stack Overflow用户

发布于 2020-12-07 01:22:51

本文可以进一步帮助您-它还提供了编码示例,您可以使用自己的代码进行尝试: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任务排入队列。

票数 0
EN

Stack Overflow用户

发布于 2021-08-12 07:34:20

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

建议将Delayed::Worker.default_priority更改为一个正数,例如: 5,然后在user workers中定义一个priority方法

代码语言:javascript
复制
class UserRequestJob < ApplicationJob
  def priority
    1 # lower numbers run first
  end
  ...
end

我还想知道,如果我为

任务创建一个单独的队列&给它一个低优先级,那么它将如何工作。它将与另一个队列一起运行,还是等待它们首先执行?

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

代码语言:javascript
复制
Delayed::Worker.queue_attributes = {
  high_priority: { priority: -10 },
  low_priority: { priority: 10 }
}

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

参考文献:

https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html

https://github.com/collectiveidea/delayed_job#named-queues

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65033229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档