トップ «前の日記(2010/10/07 (木) ) 最新 次の日記(2010/10/09 (土) )» 編集 RSS feed

HsbtDiary


2010/10/08 (金) [長年日記]

[ruby][resque][redis] resque を使ってみた

今のプロジェクトでだいぶスケールがでかい非同期処理を用いる必要が出てきたので、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 と組み合わせたときの色々についてはまた後で。