2011-06-03 78 views
3

每当每天都会调用rake任务时,我会使用,但每个任务都会启动一个新的Rails环境。我如何在一天中运行任务而无需为每项工作重新启动Rails?Rails:每当+ delayed_job优化rake任务?

这是我想出来的,想得到一些关于这个的反馈...?

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

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

  3. 指示每当调用每个Model.method而不是调用rake任务

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

-

的运转轨道3

回答

0

很多好的解决方案,这个问题,一个我终于结束了整合是这样的:

  1. 动了我的耙代码到适当的模式
  2. 调用从浏览器模型的方法添加控制器/路由代码
  3. 使用whenever宝石配置cronjobs运行command 'curl mywebsite.com/model#method'

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

+0

我也使用过这种方法,我喜欢它。卷曲或wget请求将所有内容踢开。它与REST模型非常吻合,并且与cron或其他东西完全整合。在旁边有一个红宝石脚本是一种混乱,并没有帮助干。 – squarism 2011-11-09 14:25:58

+1

想知道,如果有一种方法进行身份验证,那么外人将不会在服务器上执行DDOS? – lulalala 2012-06-07 10:34:04

+1

@lulalala如果您只有一台服务器,则可以检查服务器所在的IP是否与发出请求的IP相同。就我而言,我将nginx配置为仅允许少数IP访问cron URL。 – Marco 2012-06-07 17:40:41

4

你当然可以考虑通过cron排队delayed_jobs,然后有一个长期运行的delayed_job工作者。

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

你也可能想看看clockwork.rb,这是一个长期运行的进程,将你正在使用的cron的(排队delayed_jobs)同样的事情:http://rubydoc.info/gems/clockwork/0.2.3/frames

你也可以只尝试在delayed_jobs使用重新入队的策略:https://gist.github.com/704047

0

评论这条线从schedule.rb

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

而是只加载所需的红宝石文件,如你的情况的模型。