RailsアプリでActiveRecordを使ったバッチ処理 その3

本家のWikiにまとまってるページがあった。

HowToRunBackgroundJobsInRails

いろいろ手段があるようだ。

  • 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を入れて立ち上げたりとかめんどくさそうだなぁ。
ということでひとまずパス。

てかざっとなめただけなので、まだいろいろとわからんことが多いです。

参考

2008/03/22追記

BackgrounDRbに関するエントリを書きました。

BackgounDRbでRailsの非同期処理とかバッチ処理とか

前の記事

Mash up Award 3rd作品応募