5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby on Rails】Active Jobをsidekiqで使ってみる

Posted at

環境

以下に後述のredisを加えて利用

Active Jobとは?

Railsガイドから抜粋

Active Jobは、ジョブを宣言し、それによってバックエンドでさまざまな方法によるキュー操作を実行するためのフレームワークです。

端的に言えば、時間のかかる処理を非同期に実行するための仕組みです。

キューの管理に使われるライブラリにはsidekiqresque等複数存在しますが、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参照

参考

Railsガイド Active Job

sidekiq系の公式情報
Sidekiq GitHub

Sidekiqの設定file
Active Job連携
redis連携
Web UI

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?