我的代码中大约有10个队列,每个队列都有单独的工作进程。所有这些都具有默认优先级- 1。
目前,来自用户(UI)和rake任务的请求在同一队列中。假设从user和rake任务中获取数据的请求进入优先级为1的同一队列中,根据请求时间的不同,两者逐个执行。
但是我想先运行来自user的请求&然后运行rake任务。我该如何管理它呢?
我还想知道,如果我为rake任务创建一个单独的队列&赋予它低优先级,那么它将如何工作。它将与另一个队列一起运行,还是等待它们首先执行?
Delayed::Worker.queue_attributes = {
high_priority: { priority: -10 },
low_priority: { priority: 10 }
}发布于 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任务排入队列。
发布于 2021-08-12 07:34:20
,但我想先运行来自用户的请求&然后运行rake任务。我该如何管理它呢?
建议将Delayed::Worker.default_priority更改为一个正数,例如: 5,然后在user workers中定义一个priority方法
class UserRequestJob < ApplicationJob
def priority
1 # lower numbers run first
end
...
end我还想知道,如果我为
任务创建一个单独的队列&给它一个低优先级,那么它将如何工作。它将与另一个队列一起运行,还是等待它们首先执行?
它将首先运行优先级较高的作业,然后再运行优先级较低的作业,事实上,在作业入队后,队列名称并不重要,除非您在定义具有优先级的队列时使用了dedicated workers:
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://stackoverflow.com/questions/65033229
复制相似问题