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見ると色々できそう。便利ね。