12

我一直在使用 Sidekiq 成功运行由 Rails 3.2 应用程序中的用户操作启动的后台作业。我的特定应用程序涉及通过第三方 API 从外部源发送和接收数据。

我需要通过不断检查每个用户是否有可下载的数据来保持数据与此外部源同步。

如上所述,到目前为止,我所有的后台工作都是由用户启动的。我的问题是,如果我想连续检查每个用户是否存在外部数据,while我想在一个循环中:

# pseudocode
while true

  for user in User.active
    data = user.get_data
    next if data.blank?

    UserDataWorker.perform_async(user.id)

  end
end

那么我把上面的代码放在哪里呢?我对如何产生一个连续的任务感到困惑。我不想将代码放在 Sidekiq 工作人员中,因为这将是一项永远不会完成的工作。还是我应该这样做?

我不想把它放在一个 rake 任务中,因为那我如何监控那个 rake 任务?我读到的关于 Sidekiq 的所有内容似乎都指向一个 Worker 运行的任务是有限的并且能够完成或出错。感谢您提供的任何帮助。

4

2 回答 2

8

Ruby 多线程就是为此而生的。在您的初始化程序文件夹中生成一个线程:

Thread.new do

  loop do

    for user in User.active
      data = user.get_data
      next if data.blank?

      UserDataWorker.perform_async(user.id)
    end

    sleep 1

  end
end

如果您的支票不需要太多资源,应该没问题。

于 2013-07-31T20:49:14.153 回答
0

我会说使用像 sidekiq 调度程序这样的 gem:https ://github.com/moove-it/sidekiq-scheduler 。

您可以轻松地每分钟或几秒钟开始工作。它将在 sidekiq 进程本身中运行,这应该对您有用,因为您需要一直运行 sidekiq。

于 2021-12-10T18:14:43.487 回答