2013-05-13 95 views
1

用户可以创建一个包含多个任务的Project对象。当用户将项目告知execute时,所有这些任务都将置于Sidekiq的默认队列中。Sidekiq的民主队列

问题是:如果用户创建一个包含1000个任务的项目并击中了按钮,则所有这1000个任务都将排队。如果在此之后,另一个用户创建一个只有一个任务的项目,当他点击执行这个项目时,其唯一的任务就放在行的末尾。

我希望后台进程能够以更民主的方式工作。如果每个项目都有自己的队列,则可能是第二个项目中的一个任务在1000个任务队列结束之前执行。

为此,我将需要每个项目的分隔队列,并且应该动态创建它。我试图完成,使用替代以下的perform_async

Sidekiq::Client.push('queue' => "project_#{self.project.id}", 'class' => TaskWorker, 'args' => [self.id]) 

然而,当我尝试execute一个项目,所有的任务都放在一个名为“project_somenumber”队列但执行没有。看来,当我使用Sidekiq::Client.push时,我需要告诉队列开始执行。这是对的吗?我怎样才能开始那队列?

回答

2

Sidekiq不支持动态队列名称。当你启动Sidekiq时,你可以通过“sidekiq -q queue1 -q queue2 ...”来告诉它哪个队列处理。请参阅Sidekiq的高级选项wiki页面以获取更多详细信息。

+0

这个改变了吗?我们一直在使用sidekiq作为我们的应用程序之一,但规格现在正在调用动态生成的队列(每个设备都有一个)。每当我们添加一个设备来获取新队列时,必须重新启动应用程序将是荒谬的。 – 2013-09-25 20:59:59

0

我有同样的问题,并通过创建的helper方法是这样解决的:

def sidekiq_queue(name) 
    [name.to_s, Settings.sidekiq_ns].join('_') 
end 

... 

class MyWorker 
    sidekiq_options quque: sidekiq_queue(:sync) 
end 

我使用动态setting.yml中,其中一套sidekiq命名空间。

PS:因为你应该在sidekiq.yml中设置这个dymanic队列。