今のプロジェクトでだいぶスケールがでかい非同期処理を用いる必要が出てきたので、delayed_job ではなく resque を使ってみた。
非同期処理の部分は Rails とは分離してスケールさせていく必要があったので、ActiveRecord にべったりな delayed_job は使わずにシンプルな Ruby コードと resque だけで作ってしまった。redis が必要なのが環境によっては色々と面倒になるかもしれないけど、その辺も含めて全部やるのが仕事なので何も問題は無い。
resque の使い方はとてもシンプルで、Foo::Jobとか FooJob のようなクラスを定義した後に self.perform で非同期にしたい処理を書くだけ。
module Foo Class Job @queue = :example def self.perform puts "hage" end end end
後は、perform を下のような形で resque のジョブキューに投入する。
Resque::enqueue(Foo::Job, params)
ジョブキューに積み上げたジョブを実行するには resque の rake task を利用する。単一の worker で実行する場合は
QUEUE=example rake resque:work
とし、複数の worker を使う場合には
COUNT=5 QUEUE=* rake resque:workers
とする。QUEUE には Foo::Job の中のインスタンス変数として @queue 入れたシンボル名を指定する。とにかく全部動かしたい場合は * で良いみたい。
rake resque:work とかは、そのままでは daemonize されないので、手軽に使いたい場合は nohup、ちゃんとしたい時には bluepill あたりにするのがよさそう。まだ試作レベルではあるけど、だいぶ良い感じに動くので来週あたりから一気にスケールさせていく予定。
bluepill や redis-objects と組み合わせたときの色々についてはまた後で。