環境
以下に後述のredisを加えて利用
Active Jobとは?
Railsガイドから抜粋
Active Jobは、ジョブを宣言し、それによってバックエンドでさまざまな方法によるキュー操作を実行するためのフレームワークです。
端的に言えば、時間のかかる処理を非同期に実行するための仕組みです。
キューの管理に使われるライブラリにはsidekiqやresque等複数存在しますが、Active Jobがそれぞれの違いを吸収してくれることで、統一のインターフェースでの利用が可能です。
Railsでメールを送信するための機能であるAction MailerはActive Jobに依存しています。
準備
1 Queueing Backendとしてsidekiqのgemをinstall
bundle add sidekiq
2 configを編集/設定ファイル作成
config/application.rb
module Myapp
class Application < Rails::Application
# ...
config.active_job.queue_adapter = :sidekiq
#...
config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
# redisをdockerで立ち上げているならlocalhostをservice名に変更
config.redis = { url: 'redis://localhost:6379' }
end
Sidekiq.configure_client do |config|
# redisをdockerで立ち上げているならlocalhostをservice名に変更
config.redis = { url: 'redis://localhost:6379' }
end
config/sidekiq.yml
設定ファイルの作成は任意ですが、初期状態ではdefautのキューが1つだけ用意されます。
Action mailerを使う場合、mailersというキューを利用するので、追加しておくと良いです
:concurrency: 5
staging:
:concurrency: 10
production:
:concurrency: 10
:queues:
- critical
- default
- low
3 sidekiqのプロセスを実行
Procfileとかでまとめると楽ですね
$ shidekiq
4 キューデータストアとしてredisを起動
今回はdockerを使っています
redis:
image: redis:latest
volumes:
- ./redis:/data
ports:
- "6379:6379"
5 Web UIのroute設定
利用しているキューや、キューに残っているJobをWeb UIで確認可能です
本番環境では認証プロセス設置した方が良い
config/routes.rb
require 'sidekiq/web'
Rails.application.routes.draw do
# ...
mount Sidekiq::Web => "/sidekiq"
end
Jobの作成
rails g job notification
app/job/notification_job.rb
class NotificationJob < ApplicationJob
queue_as :default
def perform(*args)
user = args[0]
# Do something later
# 例えば外部APIを叩いて通知をするような処理 (ユーザーが追加されたことをお知らせする処理とか)
Rails.logger.info("#{user.name}が追加されました")
end
end
使い方
users_controller
def create
# ...
# Userを登録
# User登録を知らせるJob(NotificationJob)をキューに追加
NotificationJob.perform_later user
end
deliver_now, deliver_later
deliver_now: 同期実行されるため、Railsと同一プロセスで実行される
deliver_later: queueにjobが入る。 非同期実行のため、キューイングバックエンドのプロセスで実行される
その他enqueu方法
Jobの実行時間を指定、優先度の変更、複数Jobの一括登録などいろいろできる
Railsガイド Active Job参照
参考
sidekiq系の公式情報
Sidekiq GitHub