0

我想检查我是否没有在 heroku 上创建无限数量的工人。

我有以下工作是由 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 创建单独的队列吗?

4

1 回答 1

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

于 2013-11-05T16:19:52.280 回答