如何使用Sidekiq连续运行后台作业



我已经成功地使用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运行的任务是有限的,并且可以完成或出错。我感谢你能提供的任何帮助。

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

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

我建议使用类似于gem的sidekiq调度器:https://github.com/moove-it/sidekiq-scheduler.

你可以很容易地每隔一分钟或几秒钟就开始工作。它将在sidekiq进程本身中运行,这应该对您有效,因为您需要一直运行sidekiq。

最新更新