RailsアプリでActiveRecordを使ったバッチ処理 その3
本家のWikiにまとまってるページがあった。
いろいろ手段があるようだ。
- AP4R
- RunnerScript(script/runner)
- daemon_generator
- RailsCron
- BackgrounDRb
- プロセスをフォークさせる
- ActiveMessaging
- スレッド使う
ここで言われているバックグラウンドのジョブを大きく二つに分けると次のようなかんじだろうか。
- ユーザーのアクションをトリガーにした非同期処理
- 定期的なバッチ処理
定期的なバッチ処理に向くアプローチ
自分のやりたいのはとりあえず後者の方なので次の手段が良さそうだ。
- RunnerScript(script/runner)
- daemon_generator
- RailsCron
RailsCronとかパッと見よさげなんだけど、入手先のサーバが落ちてて試せなかった。
ずっと落ちっぱなしみたい。
とりあえずはRunnerScriptかね。
ただしRunnerScriptを使う場合は以下の点に注意とのこと。
- ジョブごとにスタートアップのコストがすごい
- 同時に複数ジョブを立ち上げるとメモリ消費がすごい
- ジョブの起動や停止をRailsから管理できない
たくさんのジョブを同時に走らせたり、走っているジョブの制御を行いたい場合はRunnerScriptは向かないみたいだ。
あとおまけとしてRunnerScriptでコントローラを使う方法がここにあった。
非同期処理のトリガーを定期的に叩く
または非同期処理のトリガーになるURLをwgetとかで叩くというのもアリかな。
非同期処理で確実なトランザクションをしたいならAP4Rがよさげに見える。
けどウェブサーバ間でリクエストを送るようなので、長い時間のかかるジョブをまかせるとタイムアウトしそう。
あとトランザクションをしっかりしたいニーズはとりあえずないのでこれは今回はパス。
BackgrounDRbはDRbサーバを立てるのでタイムアウトの心配がなく長時間かかる処理にはいいかもしれない。
これ試してみようか。
ActiveMessageはActiveMQを入れて立ち上げたりとかめんどくさそうだなぁ。
ということでひとまずパス。
てかざっとなめただけなので、まだいろいろとわからんことが多いです。
参考
- HowToRunBackgroundJobsInRails
- RailsCronプラグインを使う – Hello, world! 瀧内@ドリコム研究室のブログ
- [rails]Rails的cronの使い方 – 与太郎プログラマの日記
- How to Execute a Rails Controller Action via. Cron
- AP4R ホームページ
- Asynchronous Messaging with Rails – kiwamu日記
- BackgrounDRbについて調べてみた – I sort my thought
- activemessaging – Google Code
2008/03/22追記
BackgrounDRbに関するエントリを書きました。