【问题标题】:Rails: whenever + delayed_job to optimize rake tasks?Rails:无论何时+delayed_job 来优化rake 任务?
【发布时间】:2011-09-08 00:59:34
【问题描述】:

我使用 whenever 全天调用 rake 任务,但每个任务都会启动一个新的 Rails 环境。如何在不为每个作业重新启动 Rails 的情况下全天运行任务?

这是我想出的,希望得到一些反馈...?

  1. 将每个 rake 任务重构为相应模型中的方法。

  2. 使用 delayed_job gem 分配低优先级并确保这些方法异步运行。

  3. 指示无论何时调用每个 Model.method 而不是调用 rake 任务

这个解决方案有意义吗?它是否有助于避免为每个作业启动一个新的 Rails 环境? .. 还是有更好的方法来做到这一点?

--

运行 Rails 3

【问题讨论】:

    标签: ruby-on-rails cron rake delayed-job whenever


    【解决方案1】:

    您当然可以考虑通过 cron 将延迟作业排入队列,然后让一个长时间运行的延迟作业工作人员。

    然后您可以使用whenever 来帮助您创建delayed_job 入队方法。让whenever 的 cron 输出调用一个小型包装脚本可能是最简单的,该脚本直接加载 active_record 和 delay_job 而不是整个 rails 堆栈。 http://snippets.aktagon.com/snippets/257-How-to-use-ActiveRecord-without-Rails

    您可能还想查看 clockwork.rb,这是一个长时间运行的进程,它会执行与您使用 cron 相同的事情(排队延迟工作):http://rubydoc.info/gems/clockwork/0.2.3/frames

    您也可以尝试在您的延迟作业中使用重新排队策略:https://gist.github.com/704047

    【讨论】:

      【解决方案2】:

      这个问题有很多好的解决方案,我最终整合的一个是这样的:

      1. 将我的 rake 代码移至适当的模型
      2. 添加了用于从浏览器调用模型方法的控制器/路由代码
      3. 使用 whenever gem 配置的 cronjobs 运行 command 'curl mywebsite.com/model#method'

      我尝试尝试过delayed_job,但不喜欢运行另一个Rails 实例的想法。我的方法不是服务器密集型的,上面的解决方案允许我利用已经运行的 Rails 环境。

      【讨论】:

      • 这个方法我也用过,很喜欢。一个 curl 或 wget 请求开始一切。它非常适合 REST 模型,并与 cron 或其他东西完美集成。旁边有一个 ruby​​ 脚本有点乱,对 DRY 没有帮助。
      • 只是想知道,是否有一种方法可以进行身份​​验证,因此外人不会在服务器上执行 DDOS?
      • @lulalala 如果您只有一台服务器,您可以检查服务器所在的 IP 是否与发出请求的 IP 相同。就我而言,我将 nginx 配置为仅允许少数 IP 访问 cron URL。
      • 这不是很不安全吗?
      • 我不明白为什么会这样。我只接受来自本地的连接,因为没有理由允许外部请求。我通过 nginx 处理这个问题,但你也可以通过 Rails 本身轻松地做到这一点。
      【解决方案3】:

      从 schedule.rb 中评论这一行

      require File.expand_path(File.dirname(__FILE__) + "/environment")
      

      在您的案例中,只加载所需的 ruby​​ 文件,例如模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 2016-03-23
        • 1970-01-01
        • 2011-08-04
        相关资源
        最近更新 更多