Active Job + Delayed Job

ちょっと時間がかかってしまう処理をバックエンドにまわしたい。
なるべく簡単に。
Rails 4.2 から Active Job が追加され、簡単にバックエンドで実行するジョブの作成やキュー登録が出来るようになっている。

Rails ガイドの日本語訳。すごい。素晴らしい。railsguides.jp

そのままの状態だと、バックエンドに処理が回されずに実行される(待ちの状態にになる)。

アダプタは色々あるみたい。
ActiveJob::QueueAdapters

見た事のあるもの、Resque、Sidekiq、Delayed Job についてちょろっと見てみた。
Resque と Sidekiq については Redis を使用するようなのでやめた。
ちょっとしたことに使いたいだけなので使用するソフトウェアは増やしたくない。
なので、Delayed Job を使うことにした。

Delayed Job については、Githubで検索すると、fork 元が一番にでてくるので見るときは注意。
また ActiveRecord で使いたいので delayed_job_active_record も必要。

delayed_job | RubyGems.org | your community gem host
github.com
github.com

雑な例として、ユーザ登録した時になんやかんやして管理者にメール送りたいわぁとしたとき。
ユーザ登録画面と、メーラーについては事前に作っておくとする。

% rails g delayed_job:active_record
   identical  bin/delayed_job
       chmod  bin/delayed_job
      create  db/migrate/20151012052033_create_delayed_jobs.rb
% rake db:migrate
% rails g job user_create_notify
      invoke  rspec
      create    spec/jobs/user_create_notify_job_spec.rb
      create  app/jobs/user_create_notify_job.rb
% vi config/application.rb
# :
module Sample
# :
    config.active_job.queue_adapter = :delayed_job
# :
end
% ./bin/delayed_job start

Jobのコード。

class UserCreateNotifyJob < ActiveJob::Base
  queue_as :default

  def perform(user)
    sleep 10 # なんやかんや重たい処理
    UserMailer.notify(user).deliver_now # Mailer は先に適当に作っとく
  end
end

呼び出す部分。

class UsersController < ApplicationController
# :
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        UserCreateNotifyJob.perform_later @user # これを追加
# :

実際は10秒も待たずにレスポンスが返る。たったこれだけ。
Delayed Job のプロセスが動作しているか監視はしないといけないが、良い監視方法というのは今のところよくわからない。

Capistrano でデプロイした際に再起動するのは以下 gem で。便利。github.com

ただ処理を後ろに回したいだけなのでほぼ機能を使ってないが、README見ると色々できそう。便利ね。