2013-11-03 71 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