Background Jobs

Active Job + Sidekiq — 重い処理を非同期で実行

Background JobはHTTPリクエストサイクルから時間のかかる処理を分離し、別プロセスで処理するパターンです。

# app/jobs/send_welcome_email_job.rb
class SendWelcomeEmailJob < ApplicationJob
  queue_as :default

  def perform(user)
    UserMailer.welcome(user).deliver_now
  end
end

# 使用
SendWelcomeEmailJob.perform_later(user)  # キューに登録(非同期)
SendWelcomeEmailJob.perform_now(user)    # 即時実行(同期)

Active Job: RailsのJob抽象化レイヤー。バックエンド交換時もコード変更不要。
Sidekiq: 最も人気のJobアダプター。Redisベース、マルチスレッドで高スループット。
Solid Queue: Rails 8の新デフォルトアダプター。DBベースでRedis不要。ただしプロセスベースでワーカーがデフォルト3つ起動し約534MB(178MB×3)のメモリを占有 — Sidekiq(スレッドベース、1プロセス)よりメモリ消費が大幅に多い。Redis不要の代わりにメモリコストが大きいトレードオフ。

リトライ:

retry_on StandardError, wait: :exponentially_back_off, attempts: 5
discard_on ActiveRecord::RecordNotFound

キーポイント

1

rails generate job SendEmail → app/jobs/にJobクラス生成

2

performメソッドに実行ロジックを記述

3

MyJob.perform_later(args) — キューに登録(非同期実行)

4

queue_as :high_priority — キュー優先度指定

5

retry_on / discard_on — リトライ/破棄ポリシー設定

6

config.active_job.queue_adapter = :sidekiq — アダプター設定

メリット

  • HTTPレスポンス時間短縮(ユーザー体験向上)
  • 失敗時の自動リトライ
  • アダプター交換容易(Sidekiq → Solid Queue)
  • キュー別優先度管理

デメリット

  • 別プロセス管理が必要(Sidekiqワーカー)
  • デバッグが複雑(非同期環境)
  • Redis依存(Sidekiq)またはDB負荷(Solid Queue)
  • 順序保証が困難
  • Solid Queue + SQLiteはマシン分離不可 — SQLiteはファイルベースでネットワーク共有不可のため、RailsとSolid Queueが同じディスク(同じマシン)で実行される必要あり。Fly.io等ではボリュームは1つのマシンにのみマウント可能で別マシンへの分離は不可。PostgreSQL/Redisならネットワーク接続可能でマシン分離が可能

ユースケース

メール送信 ファイル処理(画像リサイズ、PDF生成) 外部API呼出 データ集計/レポート生成 CSVインポート/エクスポート