2012-12-11 29 views
2

我正在開發一個Rails應用程序,它通過從第三方站點(類似於http://railscasts.com/episodes/190-screen-scraping-with-nokogiri)刮取價格來提供各種產品的定價數據。Rails&Heroku上的定期後臺作業

由於我是編程新手,現在我通過將代碼放入rake任務來手動執行此操作。任務循環遍歷數據庫中的所有產品,並通過刮取更新其價格。完成需要幾個小時(因爲有1000個產品),但大部分時間都是通過撥打睡眠來完成的,所以我可以限制自己的速度。現在我從命令行手動調用rake任務,但是我想每週定期執行一個自動在後臺運行的作業。

經過一些研究,似乎有幾種方法可以做到這一點(Resque,DelayedJob,Cron /每當),但我不確定哪個最適合我的需要。另外,我正在通過Heroku進行部署,所以我想確保我不會在工人的dynos上浪費金錢;現在這只是一個副項目,所以我不想花那麼多錢。

什麼將是一個簡單和成本效益的方式來做到這一點?

回答

6

我目前在使用Heroku Scheduler。它可以每天,每小時或每10分鐘運行一次任務。這是非常容易使用:

  1. 安裝附加與heroku addons:add scheduler:standard
  2. 轉到您的應用程序在Heroku的網站,選擇計劃程序中添加,並添加新的工作。您可以通過定義任務(rake name_of_your_task),頻率和下一次運行來完成此任務。並做了。

有,但是,以下幾個問題:

  1. 你需要給一個有效的信用卡,以便能夠使用這個插件,即使它是原則,免費。

  2. 調度程序運行一次性過程,這些過程將計入您的動態小時數。

  3. Heroku每個應用程序只給你750個免費動態小時。

這是調度的維基有什麼看法Long-running jobs

計劃作業是爲了執行短期運行的任務或排隊較長的運行任務到後臺作業隊列。任何需要超過幾分鐘才能完成的事情應該使用工人動態測試來運行。

所以在這裏我的建議是:

  1. 打破你的rake任務進入意味着只有一兩分鐘運行更小的塊。

  2. 更週期性地運行這些任務(您甚至沒有使用調度程序的每週選項)。

  3. 留意您的動態時間。你可以這樣做here。 750小時達31天6小時。所以你在這31天的時間裏至少有6個小時的時間。如果您的應用程序未被使用,您也可以使用以下命令將其關閉,以便停止計算正常的動態小時數。

    heroku ps:scale web=0 
    

    你可以擴展它備份與

    heroku ps:scale web=1 
    

遺憾的是,因爲沒有這樣的東西免費的計算能力。

+1

哇,現在我看着這個答案,我必須非常喜歡列表:D – Ashitaka

+0

如果我無法將我的任務分解成更小的塊,對我應該做什麼有什麼建議? – slykat

+0

你有什麼嘗試?你是否只抓取你定義的頁面?如果你是,那麼你可以把它們放在一個數組中,並且有一個函數,這個函數根據星期幾從某個索引開始,到數組的另一個索引結束。如果你正在拼寫一大堆你沒有定義的頁面,那麼你可以設置一個硬性限制。例如,每天有1000件產品。所以你應該有一個計數器,當它達到1000時,保存你想要刪除的下一頁的網址或ID,並在你離開的第二天繼續。 – Ashitaka