読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【Rails】delayed_jobのenqueue方法とqueue(非同期処理)実行方法についてまとめ

ruby Rails

Railsで非同期処理を行うためのgemであるdelayed_jobを使ったので、
キューを入れる方法とそのキューの実行方法をわかった範囲でまとめておこうと。


検証環境(version)
Rails 3.2.11
delayed_job 4.0.0
delayed_job_active_record 4.0.0

今回はキューをActiveRecord経由でDB(mysql)に保存しました。
他のデータストア使う場合は
少し異なる内容があるかもしれません。


導入方法や詳細はGithub等見てください!
collectiveidea/delayed_job · GitHub
collectiveidea/delayed_job_active_record · GitHub



enqueue方法

1,Hogeクラスのインスタンスメソッドfugaを非同期で実行したい(enqueueしたい)

このようにdelayをはさんで呼び出すとfugaの処理をenqueueしてくれる

@hoge = Hoge.new
@hoge.delay.fuga()

2,Hogeクラスのインスタンスメソッドfugaを常に非同期で実行したい

定義しているHogeのクラスで以下のように書く

class Hoge

  def fuga
    #### 処理 ####
  end

  # このように定義するとfugaメソッドは常に非同期で実行される
  handle_asynchronously :fuga

end


※どちらのenqueue方法でも設定したいキューのパラメータを渡せます

@hoge.delay(priority: 20, queue: "piyo").fuga()

  handle_asynchronously :fuga, priority: 20, queue: "piyo"

3,カスタムジョブを定義して非同期で実行したい

自分で実行するJobクラスを定義することもできます。
とっても簡単で、用意したクラスのperformというメソッドに非同期で実行させる処理を書くだけ。

class Hoge

  def perform
    # ここに非同期で実行する処理を書く
  end

  # フックメソッドとかも色々用意してあるので必要な場合は実装する
  # https://github.com/collectiveidea/delayed_job#hooks

end


で、カスタムジョブをenqueueするには以下のように。

@hoge = Hoge.new
Delayed::Job.enqueue @hoge
# もちろんパラメータ渡せます
Delayed::Job.enqueue @hoge, :queue => 'piyo'

dequeue(キューを実行)する

1,rails console上で実行する場合

キューを取り出さずに処理を実行する

Delayed::Job.last.invoke_job


キューを取り出して処理を実行(ワーカーとほぼ同じ動き)

Delayed::Worker.new.run(Delayed::Job.last)


※Delayed::Job.lastは例として一番最後にあるJobインスタンスをただ取ってきているだけです。

2,rakeコマンドでワーカー起動して実行させる場合

queue名がfooのものを実行するワーカーを起動

$ QUEUE=foo rake jobs:work


queue名がfooもしくはbarのものを実行するワーカーを実行

$ QUEUES=foo,bar rake jobs:work


止めるときはctrl + cで止めればよい。
rake jobs:workoffでも止めれると書いてある…バックグラウンド実行時とかかな??(未確認)

3,実行スクリプトでワーカー起動して実行させる場合

最初の設定段階で

$ rails generate delayed_job:upgrade

を実行した際におそらくscript/にdelayed_jobという起動スクリプト?ができているので
それを使ってワーカーを実行します。


$ RAILS_ENV=hogehoge script/delayed_job パラメータ 処理名
のように記述します。


処理名は以下の4つ
start:ワーカーをバックグラウンドで実行
restart:ワーカーを再起動
stop:ワーカーを止める
run:ワーカーをフォアグラウンドで実行?


パラメーターはたくさんあるので下記プログラム参照
(ソースではなくもっと見やすいものがありそうですが見つけられず…)
https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/command.rb


例)
production環境でqueue名がfooのものを処理するワーカーを2プロセスで実行

$ RAILS_ENV=production script/delayed_job --queue=foo -n 2 start


といった感じでしょうか(゚з゚)