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

Posted

技术标签:

【中文标题】如何使用 Sidekiq 运行连续的后台作业?【英文标题】:How can I run a continuous background job with Sidekiq? 【发布时间】:2013-07-22 16:13:26 【问题描述】:

我一直在成功使用 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 运行的任务是有限的并且能够完成或出错。感谢您提供的任何帮助。

【问题讨论】:

使用cron作业怎么样? 我想过,但 cron 更面向任务,我正在寻找的更像是一个守护进程。 【参考方案1】:

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

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

【讨论】:

这个问题是当 rails 崩溃或停止时,这个脚本也将停止运行,因为它在同一个进程上运行。有没有办法在单独的进程中运行它? @AKWF【参考方案2】:

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

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

【讨论】:

以上是关于如何使用 Sidekiq 运行连续的后台作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行

Sidekiq 作业已安排,没有运行,只是消失了

ActiveJob + Sidekiq 6.0.3:如何写入日志文件?

Rails 6主动存储sidekiq文件在S3上上传背景图片

Rails:如何重启sidekiq?

Sidekiq Rails 4.2使用活动作业还是工作者?有什么不同