2013-11-03 115 views
0

我想檢查一下我是不是在heroku上創建了無數的工人。Sidekiq架構問題

我有一個是由發條寶石開始在Heroku以下工作:

every 5.minutes, SyncAccounts 

同步帳戶看起來是這樣的:

def perform 
    UserRepo.all.each do |user| 
     EnqueueFolderSyncJobs.perform_async user.id 
     SyncContacts.perform_async user.id 
     SyncMeetings.perform_async user.id 
    end 
    end 

它循環通過每一個用戶,並造成進一步的工人。這些工人可能會產生更多的工人,例如,EnqueFolderSyncJobs創建一個工人同步IMAP文件夾:

google.email.folders.each do |folder| 
    SyncFolder.perform_async user_id, folder unless skip?(folder) 
    end 

每5分鐘那麼這種情況正在發生。

調用perform_async是否意味着該作業只發生一次?

我是否需要在所有這些結束時撥打電話?

此外,所有工作人員都在相同的隊列下創建,我應該爲SyncFolders創建單獨的隊列嗎?

回答

0

默認情況下,Sidekiq將併發性限制爲25個工人。如果需要,你可以在sidekiq.yml中增加它。但是這種併發性限制了它從「無限」的工作者。 https://github.com/mperham/sidekiq/wiki/Advanced-Options#concurrency

調用「perform_async」意味着您正在調用該作業一次,只會在失敗並重試時再次發生。我認爲沒有理由讓你創建另一個隊列,除非某些工作優先,並且應該總是先處理。 https://github.com/mperham/sidekiq/wiki/Advanced-Options#queues

除測試環境外,調用.drain是不必要的。

如果您絕對需要在特定工作流程中處理您的工作人員,而不是立刻將所有工作轉入隊列(在您的示例中,這看起來並不重要),請參閱Sidekiq Superworker。我沒有用過它,但它看起來很有趣。

https://github.com/socialpandas/sidekiq-superworker