Rails& amp;上的定期后台工作Heroku的

时间:2012-12-11 02:23:25

标签: ruby-on-rails heroku screen-scraping web-scraping

我正在开发一个Rails应用程序,它通过从第三方网站(类似于http://railscasts.com/episodes/190-screen-scraping-with-nokogiri)抓取价格来提供各种产品的定价数据。

由于我是编程新手,现在我通过将我的代码放在rake任务中手动执行此操作。任务循环遍历我的数据库中的所有产品,并通过抓取更新其价格。这需要几个小时才能完成(因为有1000种产品),但大部分时间都来自于睡眠,所以我可以限制自己。现在我正在从命令行手动调用rake任务,但是我希望有一个自动在后台运行的每周定期作业。

经过一些研究后,似乎有几种方法可以做到这一点( Resque,DelayedJob,Cron / Whenever ),但我不确定哪种方法最适合我的需要。另外,我正在通过Heroku进行部署,所以我想确保我不会浪费钱给工作人员;现在这只是一个侧面项目,所以我不想花那么多钱。

这样做的简单且具有成本效益的方法是什么?

1 个答案:

答案 0 :(得分:6)

我目前正在使用Heroku Scheduler。它可以每天,每小时或每10分钟运行一次任务。它非常易于使用:

  1. 使用heroku addons:add scheduler:standard
  2. 安装加载项
  3. 转到Heroku网站上的应用程序,选择Scheduler加载项并添加新作业。您可以通过定义任务(rake name_of_your_task),频率和下一次运行来完成此操作。并完成了。
  4. 然而,有几个问题:

    1. 您需要提供有效的信用卡才能使用此附加组件,即使它原则上是免费的。

    2. 计划程序运行一次性流程,计入您的dyno-hours。

    3. Heroku每个应用程序只能为您提供750个免费的dyno小时。

    4. 这是调度程序维基对Long-running jobs所说的内容:

        

      计划作业用于执行短期运行任务或将较长时间运行的任务排入后台作业队列。任何需要花费几分钟才能完成的事情都应该使用工作人员的dyno来运行。

      所以我的建议是:

      1. 将你的佣金任务分解成只需要运行几分钟的小块。

      2. 更多地定期运行这些任务(您甚至没有使用调度程序的每周选项)。

      3. 留意你的动态时间。你可以这样做here。 750小时达31天6小时。因此,在这31天的工作中,您至少有6个小时的工作时间。如果您的应用程序未被使用,您还可以使用以下命令将其关闭,以便停止计算常规dyno小时。

        heroku ps:scale web=0
        

        你可以用

        重新调整它
        heroku ps:scale web=1
        
      4. 不幸的是,没有免费的计算能力。