2014年11月17日 星期一

heroku省錢計劃 從clockwork到heroku scheduler配上delayed_job與workless

clockwork與delayed_job在heroku

他的問題就是要花很多錢,因為clockwork佔一個work,delayed_job也佔一個worker,heroku上只要你打開worker就開始算錢,即使你一天才跑一次,也是一樣,所以我用了heroku scheduler來取代clockwork,要注意的是他是best-effort service也是就他在很少的情況下可能不會執行,所以如果在如果你要執行的功能非常重要,那還是乖乖付錢用clockwork吧!,參考這篇


那delayed_job咧?

這時候就要用workless gem,他幫你在jobs都跑完的時候關掉worker,有jobs的時候打開worker,這樣就省了不少錢了,安裝方式看這裡


從clcokwork到heroku scheduler

clockwork用一個根目錄下的clockwork.rb來把工作加入排程,heroku scheduler就不一樣了,他用的是task,像下面這樣子。

# lib/tasks/scheduler.rake
desc "This task is called by the Heroku scheduler add-on"
task :check_times => :environment do
  puts "Checking Time Left..."
  ActionController::Base::ApplicationController.new.check_times
  puts "done."
end

特別要注意的是你的action是放在model裡面就可以像這樣叫他Model.check_times,但是如果是放在controller就要先建立instance才可以呼叫他,像上面寫的那樣,要有一個.new,接著執行下面的指令,再把每一個task輸入,舉例來說,上面的就要輸入rake check_times,時間到了就會自動把要執行的東西交給delayed_job了
heroku addons:open scheduler
當你打開worker的時候你的heroku免費750小時就開始減少了,所以測試完記得關掉喔


附註
在delayed_job執行的action如果有flash的訊息的話,log會出現一堆錯訊訊息,因為沒有request有flash也沒用,只要把flash刪掉就沒事了,當初我找了一陣子才知道的說。

沒有留言:

張貼留言