Clock processes ruby - herokaijp/devcenter GitHub Wiki
バックグラウンドジョブをスケジュールする機能はほとんどの最近のウェブアプリケーションに求められています。これらのジョブは、メールの送信のようにユーザ指向的なもの、データの同期やバックアップのように管理的なもの、またはよりアプリ自身にとって不可欠な部分になったりもするでしょう。
単体のサーバへのデプロイの場合は、cron
のようなシステムレベルでのツールが、このようなスケジューリングを実現する明確な手段として存在しています。しかしながら、Herokuのようなクラウドプラットフォームへデプロイする場合、マシンローカルなツールが便利でないような分散環境のなかでアプリケーションのインスタンスが走るため、幾分か高度なレベルが要求されます。
Heroku Schedulerアドオンは10分、1時間、1日(もしくはこれらの複数倍)間隔で走らせる必要がある単純なタスクに対する素晴らしい解決策です。しかし、5分ごとや37分ごと、もしくはもっと具体的な時間で実行される必要のあるタスクだったらどうでしょうか? これらのようなスケジューリングプロセスで実行される、よりユニークで複雑な場合でも、とても便利なものとなるでしょう。
Rubyにはいくつかのスケジューリング用のライブラリがあります。rufus-scheduler gemは数年前から存在し、今でも有名です。resque-scheduler拡張も共にものすごく有名ですが、これはResqueのバックグラウンドジョブのライブラリであることは明らかです。
この例のために、軽くて、包括的なスケジューリングのgemであるclockworkをこれから使って行きます。洗練されており、簡単に使えるスケジューリングDSLを持ち合わせ、依存性が少なく特定のジョブクエリシステムを苦しめることはありません。
Gemfileにclockworkを追加し、bundle install
を実行してclockworkをインストールします :
:::ruby
gem 'clockwork'
次に、あなたはスケジュールを定義するためにファイルを編集する必要があります。clockwork READMEには、ライブラリの柔軟性を示したたくさんの素晴らしい例があります。
この例では、Delayed Jobキューシステムを使って、Railsアプリケーションにジョブをキューに追加して行きます。ここに lib/clock.rb
の例となるファイルがあります :
:::ruby
require File.expand_path('../../config/boot', __FILE__)
require File.expand_path('../../config/environment', __FILE__)
require 'clockwork'
include Clockwork
every(4.minutes, 'Queueing interval job') { Delayed::Job.enqueue IntervalJob.new }
every(1.day, 'Queueing scheduled job', :at => '14:17') { Delayed::Job.enqueue ScheduledJob.new }
ここでは、2種類の異なった方法でバックグラウンドジョブをキューにつめるようにclockworkを設定しました。始めの命令は、クロックプロセスが起動された時からIntervalJob
を4分毎にキューに追加します。二つ目はScheduledJob
を毎日午後2時17分に一度キューに追加します。
最終的には、Procfileの中でプロセスタイプを定義する必要があります。この例では、clock
プロセスを呼び出そうとします。そしてProckfileはこのように見えているはずです :
clock: bundle exec clockwork lib/clock.rb
Gemfile,Procfile,そしてclock.rbの変更をコミットして、アプリケーションを再度デプロイします。
最終のステップはクロックプロセスをスケールアップです。これはシングルトンのプロセスなので、あなたはこれらのプロセスを1個以上増やして行く必要がないことを意味しています。もし、2つ実行した場合、仕事は複製されるでしょう。
:::term
$ heroku ps:scale clock=1
Herokuのログで以下のものと似たような出力を見る事ができるはずです。
2012-05-30T20:59:38+00:00 heroku[clock.1]: State changed from created to starting
2012-05-30T20:59:38+00:00 heroku[api]: Scale to clock=1, web=3 by [email protected]
2012-05-30T20:59:40+00:00 heroku[clock.1]: Starting process with command `bundle exec clockwork lib/clock.rb`
2012-05-30T20:59:41+00:00 heroku[clock.1]: State changed from starting to up
2012-05-30T20:59:48+00:00 app[clock.1]: Starting clock for 1 events: [ Queueing interval job ]
2012-05-30T20:59:48+00:00 app[clock.1]: Queuing scheduled jobs
今、あなたはカスタムクロックプロセスを立ち上げ、実行できました。ラムダ関数や:ifを使った条件制御のスケジューリングを含んだ、より多くのオプションを確認するためにclockwork README を確認してください。