Sidekiq的民主党队列

时间:2013-05-13 20:48:21

标签: ruby-on-rails asynchronous redis 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时,我需要告诉队列开始执行。这是对的吗?我如何启动该队列?

2 个答案:

答案 0 :(得分:2)

Sidekiq不支持动态队列名称。当您启动Sidekiq时,您可以通过“sidekiq -q queue1 -q queue2 ...”告诉它要处理哪些队列。有关更多详细信息,请参阅Sidekiq的高级选项维基页面。

答案 1 :(得分:0)

我有同样的问题并通过创建这样的辅助方法来解决它:

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