Rails5でheroku上でactive jobsによる非同期処理を行う

導入

# gemfile
gem 'delayed_job_active_record'

# terminal
$bundle exec rails generate delayed_job:active_record

# terminal
$ rake db:migrate

# Procfile
worker: rake jobs:work

Procfileは <process type>: <command>の形式で使えます。

自分は プロセス release にbudnle exec rake db:migrateをアタッチしてmigrationを(手動だと忘れるので)やり忘れないようにしています。

Delayed Jobは ActiveRecord のオブジェクトに、delayメソッドを追加してくれます。

@post = Post.find(10)
@post.delay.send_reminder!

herokuのproduction環境でまだworkerを立ち上げていない場合は

heroku ps:scale worker=1

で追加できます。

@instance.delay.some_method のかたちではなく、 もう some_methodは常にasyncにしたいよ、という場合には、メソッド宣言の後に handle_asynchronously でアタッチします。

class Device
  def deliver
    # long running method
  end
  handle_asynchronously :deliver
end

という記述法が可能です。

パラメータ

delay と handle_asyncronously は以下のパラメータを持つことが出来ます。

  • priority : 小さい値ほど高くなります。
  • run_at: どれくらい経過したら実行開始するかを示すことが出来ます。

 デバッグ

bundle exec rake jobs:work

でローカルでworkerを作りログを見る事が可能です。