2

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

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

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

什么是一种简单且具有成本效益的方法来做到这一点?

4

1 回答 1

6

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

  1. 安装附加组件heroku addons:add scheduler:standard
  2. 在 Heroku 网站中转到您的应用程序,选择调度程序插件并添加一个新作业。您可以通过定义任务 ( rake name_of_your_task)、频率和下一次运行来做到这一点。并做了。

但是,有几个问题:

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

  2. 调度程序运行一次性进程,这些进程将计入您的 dyno-hours。

  3. Heroku 仅为每个应用程序提供 750 个免费测功小时。

这是调度程序的 wiki 对长时间运行的作业所说的:

计划作业旨在执行短期运行的任务或将较长运行的任务排入后台作业队列。任何需要超过几分钟才能完成的事情都应该使用工人测功机来运行。

所以我的建议是:

  1. 将你的 rake 任务分解成更小的块,意味着只运行几分钟。

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

  3. 留意你的测功机时间。你可以在这里这样做。750小时相当于31天6小时。因此,在这 31 天的月份中,您至少有 6 小时的工作时间。如果您的应用程序没有被使用,您还可以使用以下命令将其关闭,以便它停止计算常规测功小时数。

    heroku ps:scale web=0
    

    你可以用

    heroku ps:scale web=1
    

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

于 2012-12-11T03:11:25.190 回答