2013-05-13 96 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隊列。