在Sidekiq的民主队列
用户可以创建包含多个任务的Project
对象。 当用户告诉项目execute
所有这些任务都放在Sidekiq的默认队列中。
问题是:如果用户创建一个包含1000个任务的项目并点击execute
按钮,那么所有这1000个任务都将被放入队列中。 如果在此之后,另一个用户创建只有一个任务的项目,当他点击执行该项目时,其唯一的任务就是放在行的末尾。
我希望这种背景过程能够以更民主的方式进行。 如果每个项目都有自己的队列,则很可能第一个项目中的一个任务在1000个任务队列结束之前执行。
为此,我将需要每个项目的separe队列,它应该动态创建。 我正在尝试使用以下代替perform_async
来实现这一点:
Sidekiq::Client.push('queue' => "project_#{self.project.id}", 'class' => TaskWorker, 'args' => [self.id])
但是,当我尝试execute
项目时,所有任务都放在一个名为“project_somenumber”的队列中,但它们都没有被执行。 看来当我使用Sidekiq::Client.push
,我需要告诉队列开始执行。 这是对的吗? 我怎么能开始那个队列?
Sidekiq不支持动态队列名称。 当您启动Sidekiq时,您可以通过“sidekiq -q queue1 -q queue2 …”告诉它要处理哪些队列。有关更多详细信息,请参阅Sidekiq的高级选项维基页面。
我有同样的问题,并通过创建这样的辅助方法解决它:
def sidekiq_queue(name) [name.to_s, Settings.sidekiq_ns].join('_') end ... class MyWorker sidekiq_options quque: sidekiq_queue(:sync) end
我使用动态settings.yml文件设置sidekiq命名空间。
PS:因为你应该在sidekiq.yml中设置这个dymanic队列。