【问题标题】:Are rake tasks suitable for long running processes in production?rake 任务是否适合生产中长时间运行的流程?
【发布时间】:2025-12-08 11:05:03
【问题描述】:

我正计划使用 rake 任务为我的 rails 应用程序开发一个长时间运行的后台进程。 rake 任务是否适合这种流程?理想情况下,我希望将它包装在一个 linux 守护进程中,以便能够轻松地启动和结束进程。

如果这不是最佳选择,还有哪些选择?我试图避免使用基于 cron 的解决方案,以避免担心时间表以及同一进程的不同运行实例在它们之间重叠的可能性。

谢谢!

【问题讨论】:

  • 这取决于您的需求,但类似 ​​cron 的工作通常由名为 god 的 gem 处理:godrb.com
  • 它将处理什么样的工作?
  • @retro 它将更新汇总表,检索新的和更新的记录以重新计算平均值、总计和总和。
  • 这真的取决于运行时间和你的服务器资源。这种方法的最大问题是你的整个 Rails 应用程序将在 rake 任务期间和期间加载到内存中。持续时间可能是 100/200+ mb ram。任务可能运行多长时间?
  • @DamienRoche,我还不知道。这将取决于要处理的数据量。我的想法是让 Windows 服务之类的东西不间断地运行,在执行之间休眠(如 30 秒或 1 分钟)。我不介意它消耗多少内存,因为我想尽可能多地使用 rails:活动记录、验证等。

标签: ruby-on-rails ruby-on-rails-4 rake-task


【解决方案1】:

你看过delayed_job gem吗?

https://github.com/collectiveidea/delayed_job

来自他们的文档:

Delayed::Job(或 DJ)封装了在后台异步执行较长任务的常见模式。

它是从 Shopify 中直接提取的,其中作业表负责许多核心任务。这些任务包括:

  • 发送海量时事通讯
  • 图像大小调整
  • http 下载
  • 更新智能收藏
  • 在产品更改后更新我们的搜索服务器 solr
  • 批量导入
  • 垃圾邮件检查

【讨论】:

  • 我建议 sidekiq 胜过delayed_job。它使用线程,使用更少的资源,并且在我的经验中更加稳定。
  • 是的,我有,工作延误等让我担心的是我在可用的文档中不清楚。如果我的工作每 5 分钟安排一次,但执行需要 10 分钟,会发生什么情况?这就是为什么我的目标是“Windows 服务”方法
  • 谢谢,下次我使用delayed_job时一定要记住:)
【解决方案2】:

这可能取决于您需要运行的后台作业类型。

基本上,如果您需要对用户输入的数据进行某种后期处理,例如为帖子渲染图像、与第三方资源进行一些异步集成等,那么您最好使用 Sidekiq(是的,它比 DelayedJob 更好人们建议)

但是,如果您需要按计划运行某些内容,例如夜间下载、清理被阻止的用户和其他内容,那么编写一个 rake 任务并使用 cron 任务启动它可能是一个非常有用的选项,因为您可以使用当您需要按需运行时来自 CLI 的那些任务

【讨论】:

    【解决方案3】:

    你可以试试delayed job这个extension

    class MyJob
    
      include Delayed::ScheduledJob
    
      run_every 1.day
    
      def display_name
        "MyJob"
      end
    
      def perform
        # code to run ...
      end
    end
    

    或者手动使用Time.now + 5.minutes 将另一个作业排入队列,例如在当前作业在 perform 方法中完成之后。

    【讨论】:

    • 不错!我从来没有想过这个解决方案!聪明而简单。