在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队列。