繁体   English   中英

Rails和Heroku上的定期后台工作

[英]Periodic background jobs on Rails & Heroku

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

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

经过一些研究,似乎有几种方法可以做到这一点( Resque,DelayedJob,Cron / Whenever ),但是我不确定哪种方法最适合我的需求。 另外,我正在通过Heroku进行部署,因此我想确保自己不会浪费金钱在工人的测功机上。 现在这只是一个附属项目,所以我不想花那么多钱。

一种简单且经济高效的方法可以做到这一点?

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

  1. 使用heroku addons:add scheduler:standard安装heroku addons:add scheduler:standard
  2. 在Heroku网站上转到您的应用程序,选择Scheduler加载项并添加新作业。 为此,您可以定义任务( rake name_of_your_task ),频率和下一次运行。 并做了。

但是,存在几个问题:

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

  2. 计划程序将运行一次性过程,该过程将计入您的动态小时。

  3. Heroku每个应用程序仅为您提供750个免费的动态小时。

这是调度程序的Wiki关于长期运行的工作的说法:

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

所以我的建议是:

  1. 将您的rake任务分解为几个小块,这些小块只能运行几分钟。

  2. 定期运行这些任务(甚至没有使用Scheduler的每周选项)。

  3. 密切注意您的动态时间。 您可以在这里进行 750小时总计31天6个小时。 因此,在这31天的时间里,您至少有6个小时可以工作。 如果未使用您的应用程序,您还可以使用以下命令将其关闭,以使其不再计算常规的动态小时数。

     heroku ps:scale web=0 

    您可以将其扩展到

     heroku ps:scale web=1 

不幸的是,没有免费的计算能力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM