scheduler Heroku addonでアプリケーションの起動状態を保つ(アイドルを防ぐ)


Herokuは一定時間応答がないとDynoがサスペンドして、次にアクセスで待ち時間が発生し、レスが悪くなってしまうそうです。その際のアイドル時間は10秒〜20秒らしいです。そこで、Heroku addonの”scheduler”を使って、 10分おきに起こす設定を追加します。


(1) Herokuアプリケーションにaddonを追加

Addonの登録には、あらかじめクレジットカードを登録しておく必要があります。

Heroku addons:add scheduler:standard

(2) taskファイルを作成

app/lib/tasks/scheduler.rake ファイルを新規作成。
このタスクの内容としては、http://test-app.herokuapp.com/にアクセスするというものです。

desc "This task is called by the Heroku cron add-on"
task :call_page => :environment do
require 'net/http'
uri = URI.parse('http://test-app.herokuapp.com/')
Net::HTTP.get(uri)
end

(3) taskの動作確認

以下を実行して動作を確認。

Heroku run Rake call_page

heroku logsで動作確認。エラーメッセージが出ていなければ成功。

heroku logs -t
2012-11-26T03:18:17+00:00 heroku[api]: Starting process with command `bundle exec rake call_page` by email@example.com
2012-11-26T03:18:21+00:00 heroku[run.1]: Awaiting client
2012-11-26T03:18:21+00:00 heroku[run.1]: Starting process with command `bundle exec rake call_page`
2012-11-26T03:18:27+00:00 app[web.1]: Started GET "/" for xx.xx.xx.xx at 2012-11-26 12:18:27 +0900
2012-11-26T03:18:27+00:00 app[web.1]: Processing by ArticlesController#index as */*
2012-11-26T03:18:27+00:00 app[web.1]: Rendered /index.html.haml within layouts/application (3.5ms)
2012-11-26T03:18:27+00:00 app[web.1]: Completed 200 OK in 8ms (Views: 7.9ms | ActiveRecord: 0.0ms)
2012-11-26T03:18:27+00:00 heroku[router]: at=info method=GET path=/ host=test-app.herokuapp.com fwd= dyno=web.1 queue=0 wait=0ms connect=4ms service=21ms status=200 bytes=704
2012-11-26T03:18:27+00:00 heroku[run.1]: Client connection closed. Sending SIGHUP to all processes
2012-11-26T03:18:28+00:00 heroku[run.1]: Process exited with status 0
2012-11-26T03:18:28+00:00 heroku[run.1]: State changed from up to complete
2012-11-26T03:18:21+00:00 heroku[run.1]: State changed from starting to up

(3) taskの定期実行を設定

Herokuにログイン => My Appsを選択 => 設定するAppを選択

Resources => schedulerを選択

Taskを “Rake call_page”と設定 => Frequencyを “Hourly”に設定 => Saveをクリック。

以上です。

🐝 変更来歴

11/26 12:00いろいろ記述ミスがあったので修正
11/27 09:32 call_pageにrequire ‘net/http’を追加

🗻 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)