投稿された動画の変換や、一日一回のリマインドメール送信といった、即時に終わらない処理や、定時に起動して実行するジョブ。Webベースのサービスと、こういったジョブを連携させたい場合、たとえフレームワークをベースにWebのプログラムを組んでいたとしても、それらのフレームワークをはみ出してUNIXの機能を使う方法が最もオーソドックスだと思います。
たとえば、データベースやファイルシステムやソケットに特定の「合図」を書き込んで、それを見張っている何かがジョブを起動したり、たとえばcronを使って定時にプロセスを起動したりするやり方です。
しかし、これらの方法はオーソドックスであるという利点を持っている反面、
- フレームワーク側からジョブのステータスを得るための標準的な方法がない
- cronやシェルといったフレームワークを記述する言語と異なる仕組みを利用しなければならないため、環境に依存しやすい/円滑なデプロイメントの妨げになる
といった欠点もはらんでいます。
こうした欠点を補うために、フレームワークとシームレスに連動するようなバックグラウンドジョブ実行の機構がいくつか開発されています。これらの機構を利用すると、たとえばWebインターフェイスから動画変換の処理をキックし、変換状況の進捗をグラフ表示するといった処理が一貫性のある方法で記述できます。
この連載では、私の独断と偏見でRuby on Rails + BackgrounDRbの例を見て行きたいと思います。
BackgrouDRbを選ぶ理由としては、比較的ポピュラーであること、定時実行と逐次実行両方の機構をもっていることが大きいのですが、もう一つ重要な理由として、BackgrounDRbの前バージョンである0.2系列と、2007年12月20日にリリースされた1.0の間で大きな仕様変更が行われているようで、最新版の機能について紹介されている文書があまり見あたらなかったので私自身困ったということが挙げられます。
では早速見ていきましょう。
前準備
利用するRuby on Railsは2.0以降を想定しています。Ruby on Railsのインストール方法は他のWebページなどを参考にしてください。また、作業にはSubversionを使用しますので、これも入れておいてください。
環境はUNIX系の環境を想定しています(私自身はMac OS Xで動作確認を行っています)。Windowsでも動くはずですが、Windowsの方はディレクトリの表記などを適宜変更してください。
Railsのバージョンは、以下のようにして確認することができます。
$ rails --version Rails 2.0.2
2.0以降のバージョンが入っていることを確認してください。
ではまず今回のサンプルで使うRailsプロジェクトを準備しましょう。名前は...いつもこういうとき迷うんですが、bdrbtest1とかで許してください。
$ rails bdrbtest1
※以下、生成されたディレクトリのトップを、(RAILSROOT)と表記します。
BackgrounDRbのインストールとセットアップ
ではまずbackgroundrbのインストールです。(RAILSROOT)で以下のようにします。
$ svn export http://svn.devjavu.com/backgroundrb/tags/release-1.0.1 vendor/plugins/backgroundrb A vendor/plugins/backgroundrb A vendor/plugins/backgroundrb/test A vendor/plugins/backgroundrb/test/meta_worker_test.rb A vendor/plugins/backgroundrb/test/backgroundrb_test.rb A vendor/plugins/backgroundrb/test/master_worker_test.rb (中略) A vendor/plugins/backgroundrb/examples/workers/renewal_worker.rb A vendor/plugins/backgroundrb/examples/workers/model_worker.rb A vendor/plugins/backgroundrb/examples/workers/foo_worker.rb Exported revision 315.
次に、セットアップコマンドを実行します。(RAILSROOT)で以下のようにします。
$ rake backgroundrb:setup (in /Users/rgoura/src/bdrbtest1) Copying backgroundrb.yml config file to /Users/rgoura/src/bdrbtest1/config/backgroundrb.yml Copying backgroundrb script to /Users/rgoura/src/bdrbtest1/script/backgroundrb Creating /Users/rgoura/src/bdrbtest1/lib/workers Copying Worker Test helper file /Users/rgoura/src/bdrbtest1/test/bdrb_test_helper.rb
上記のようなメッセージが表示されればセットアップ完了です。
簡単な動作確認
BackgrouDRbでは、Railsのserverとは別に、BackgrounDRb用のサーバーを別途稼働させる必要があります。
このサーバーが起動するかどうかを確かめましょう。(RAILSROOT)で、
$ ./script/backgroundrb start
とすると、BackgrounDRb用のサーバーが起動します。何も起こらなかったように見えるかもしれませんがデフォルトではデーモンとして起動します。
この状態で、
./script/consoleと打ってRailsのコンソールを出し、下記のように「MiddleMan.query_all_workers」と打ったときに、ハッシュが返ってくれば、とりあえずインストールは成功です。
$ ./script/console
Loading development environment (Rails 2.0.2)
>> MiddleMan.query_all_workers
=> {:log_worker=>nil}
Rails側からジョブを呼び出したり、ジョブを登録したりする際には、ほとんどこのMiddleManを介して行います。Middlemanと綴り間違えてイライラすることがあるので、気をつけましょう(私だけか)。
BackgrounDRbでは、ジョブのことをworker(ワーカー)と呼びます。query_all_workersは、現在稼働中のworkerの一覧をハッシュで得るメソッドです。上記の結果は、log_workerというworkerが稼働中であることを表しています。log_workerについてはちゃんと調べていないので適当なことを言って恐縮ですが、ログを取るworkerですかね。
(./script/consoleはexitで抜けてください)BackgrounDRb用のサーバーを停止する場合には、
$ ./script/backgroundrb stop
とします。ログは、(RAILSROOT)/log/以下に吐かれるのですが、このへんのことは追々説明してゆきますね。
ではまた次回!
Leave a comment