Clock processes ruby - herokaijp/devcenter GitHub Wiki

バックグラウンドジョブをスケジュールする機能はほとんどの最近のウェブアプリケーションに求められています。これらのジョブは、メールの送信のようにユーザ指向的なもの、データの同期やバックアップのように管理的なもの、またはよりアプリ自身にとって不可欠な部分になったりもするでしょう。

単体のサーバへのデプロイの場合は、cronのようなシステムレベルでのツールが、このようなスケジューリングを実現する明確な手段として存在しています。しかしながら、Herokuのようなクラウドプラットフォームへデプロイする場合、マシンローカルなツールが便利でないような分散環境のなかでアプリケーションのインスタンスが走るため、幾分か高度なレベルが要求されます。

Heroku Schedulerアドオンは10分、1時間、1日(もしくはこれらの複数倍)間隔で走らせる必要がある単純なタスクに対する素晴らしい解決策です。しかし、5分ごとや37分ごと、もしくはもっと具体的な時間で実行される必要のあるタスクだったらどうでしょうか? これらのようなスケジューリングプロセスで実行される、よりユニークで複雑な場合でも、とても便利なものとなるでしょう。

Clockwork

Rubyにはいくつかのスケジューリング用のライブラリがあります。rufus-scheduler gemは数年前から存在し、今でも有名です。resque-scheduler拡張も共にものすごく有名ですが、これはResqueのバックグラウンドジョブのライブラリであることは明らかです。

この例のために、軽くて、包括的なスケジューリングのgemであるclockworkをこれから使って行きます。洗練されており、簡単に使えるスケジューリングDSLを持ち合わせ、依存性が少なく特定のジョブクエリシステムを苦しめることはありません。

Gemfileにclockworkを追加し、bundle installを実行してclockworkをインストールします :

:::ruby
gem 'clockwork'

スケジュールの実行

Herokuのランタイムサーバは時間をUTCで表します。あなたのスケジュールについても同様に扱わなければなりません。

次に、あなたはスケジュールを定義するためにファイルを編集する必要があります。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 を確認してください。

⚠️ **GitHub.com Fallback** ⚠️