Railsでアプリを作っていると、「時間がかかる処理を裏で実行したい」 と思うことはありませんか?
(例:CSVエクスポート、メール送信、画像処理など)
そんなときに登場するのが、**Sidekiq(サイドキック)**です。
自分自身まだ理解の途中なので、この記事では
「Sidekiqって結局なに?」
「どうやって動いてるの?」
を整理する備忘録としてまとめました。
🧩 Sidekiqとは?
Sidekiqは、Ruby製の非同期ジョブキューライブラリです。
簡単に言うと、「処理をすぐに実行せず、あとで実行してくれる仕組み」です。
Rails標準のActiveJobから呼び出すこともできるので、
perform_later
と書くだけで、処理をバックグラウンドで実行できます。
⚙️ 仕組みをざっくり図で理解する
非同期処理の流れを図で見ると、こうなります👇
┌────────────────────┐
Railsアプリ
(Sidekiq Client)
└─────────┬──────────┘
│ ジョブを登録
▼
┌────────────────────┐
Redis
(キュー)
└─────────┬──────────┘
│ ジョブを取得
▼
┌────────────────────┐
Sidekiq Worker
(バックグラウンド処理)
└────────────────────┘
- Client … RailsアプリからジョブをRedisに登録
- Redis … キューとしてジョブを一時保管
- Worker … Redisからジョブを取り出して処理を実行
🚀 なぜ非同期処理が必要なのか
Railsの通常のコントローラでは、リクエストを受けたらその場で処理が終わるまで待ちます。
例えば:
def create
UserMailer.welcome_email(@user).deliver_now
end
これだと、メール送信が完了するまでユーザーにレスポンスが返りません。
一方で、Sidekiqを使えば…
def create
UserMailer.welcome_email(@user).deliver_later
end
こう書くだけで、処理が裏で実行され、レスポンスは即時に返ります ✨
→ ユーザー体験も向上し、アプリのスループットも上がります。
🧠 Redisとの関係
SidekiqはRedisをバックエンドとして使います。
Redisには「ジョブ(やるべき処理)」がキューとして溜まっていきます。
SidekiqのワーカーはRedisを監視していて、ジョブが登録されるとそれを取り出して実行します。
📦 イメージ:
Redis = ジョブ置き場(タスクの一時保管箱)
Sidekiq = それを取り出して処理する作業員
🛠️ RailsでSidekiqを導入してみる
① Gemをインストール
# Gemfile
gem "sidekiq"
bundle install
② Jobを作成
bin/rails g job sample
app/jobs/sample_job.rb が生成されます。
class SampleJob < ApplicationJob
queue_as :default
def perform(name)
puts "Hello, #{name}! (from Sidekiq)"
sleep 3
puts "Finished processing for #{name}"
end
end
③ Sidekiqを起動
bundle exec sidekiq
これでSidekiqがRedisを監視し始めます。
ジョブを実行してみましょう👇
SampleJob.perform_later("test")
Sidekiqのログに "Hello, test!" と出力されれば成功です。
🧭 Queue(キュー)の設定
ジョブの優先度を設定したい場合は、config/sidekiq.yml を用意します。
:concurrency: 5
:queues:
- [critical, 2]
- [default, 1]
- [low, 1]
-
criticalキューを優先的に処理 - 同時に最大5ジョブまで処理
⚙️ config/sidekiq.yml の設定を詳しく理解する
config/sidekiq.yml は、Sidekiqの並列実行数やキューの優先順位などを定義する設定ファイルです。
プロジェクトによって内容は異なりますが、基本形は以下のようになります。
:concurrency: 5
:queues:
- [critical, 3]
- [default, 2]
- [low, 1]
:timeout: 25
:logfile: ./log/sidekiq.log
各項目の意味
| 設定キー | 意味 | 補足 |
|---|---|---|
:concurrency |
同時に実行できるジョブの数(スレッド数) | Sidekiqはマルチスレッドで動作するため、サーバー性能に応じて設定する |
:queues |
キューの優先順位と重み | 上にあるものほど優先度が高い。数値を指定すると「重み(処理頻度)」を調整できる |
:timeout |
シャットダウン時のタイムアウト秒数 | graceful shutdown 時にこの時間を過ぎるとジョブを強制終了 |
:logfile |
ログ出力先ファイル | 本番環境では log/sidekiq.log に指定することが多い |
🎯 優先順位の制御イメージ
:queues:
- [critical, 3]
- [default, 2]
- [low, 1]
上記の場合、Sidekiqはおおよそ次のような比率でジョブを取得します。
-
critical… 約50% -
default… 約33% -
low… 約17%
※ 比率はおおまかですが、「重要なジョブを優先的に処理したい」場合に便利です。
🧩 実行時に設定を読み込む
Procfile.dev や docker-compose.yml の Sidekiq起動コマンドで、設定ファイルを指定します。
bundle exec sidekiq -C config/sidekiq.yml
Docker Compose 例:
sidekiq:
build: .
command: bundle exec sidekiq -C config/sidekiq.yml
depends_on:
- redis
💡環境ごとに設定を分けたい場合
Rails 7以降では、config/sidekiq.yml に erb を使って環境変数を組み込むことができます。
:concurrency: <%= ENV.fetch("SIDEKIQ_CONCURRENCY", 5) %>
:queues:
- [default, 1]
- [mailers, 1]
こうしておくと、DockerやHerokuなどで環境ごとにスレッド数を柔軟に変更できます。
🧠 ポイントまとめ
-
:concurrencyはCPUコア数やRedis接続数に注意して設定する -
:queuesの順序で優先順位を決められる -
sidekiq -Cオプションで設定ファイルを指定する - ERBを使えば環境ごとに柔軟な設定が可能
🕸 Sidekiq Web UIでジョブを確認
Sidekiqには管理画面が用意されています。
config/routes.rb に以下を追加👇
require "sidekiq/web"
mount Sidekiq::Web => "/sidekiq"
ブラウザで
👉 http://localhost:3000/sidekiq
を開くと、ジョブの状況や失敗数、再試行回数などを確認できます。
こんな感じ

🧩 よく出てくる用語まとめ
| 用語 | 意味 |
|---|---|
| Worker | 実際に処理を行うクラス(perform メソッドを持つ) |
| Queue | ジョブを並べる場所(優先度ごとに複数設定可能) |
| Job | 処理の単位(1件のタスク) |
| Retry | 失敗したジョブを再実行する機能 |
| Dead Set | 何度も失敗して諦められたジョブを保管する領域 |
🧯 よくあるトラブルとヒント
| 症状 | 原因 | 対処 |
|---|---|---|
| ジョブが実行されない | Redisが起動していない |
docker psでRedisを確認 |
| perform_laterしても動かない | ActiveJobのアダプタ設定がSidekiqになっていない | config.active_job.queue_adapter = :sidekiq |
| SidekiqがRedisに接続できない | 接続URLが誤っている |
REDIS_URL を確認 (redis://redis:6379/0 など) |
🔧 Docker Composeで動かす例
# docker-compose.yml
services:
api:
build: .
command: bundle exec rails s -b 0.0.0.0
depends_on:
- redis
environment:
- REDIS_URL=redis://redis:6379/0
redis:
image: redis:7
ports:
- "6379:6379"
sidekiq:
build: .
command: bundle exec sidekiq
depends_on:
- redis
- api
これで docker compose up すれば、Rails・Redis・Sidekiqが連携して動きます。
📝 まとめ
- Sidekiqは Ruby/Rails用の非同期ジョブキューライブラリ
- Redisを使ってジョブをキューに貯め、バックグラウンドで処理
- ActiveJobと連携して
perform_laterで簡単に実行できる - Web UIでジョブの状態や失敗履歴を可視化できる
💬 おわりに
Sidekiqは仕組みを理解するととてもシンプルです。
今後は実際のプロジェクトで、メール送信やCSV出力などを非同期化していきたいと思います。