0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Sidekiqについてまとめてみた

Posted at

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.devdocker-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.ymlerb を使って環境変数を組み込むことができます。

: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
を開くと、ジョブの状況や失敗数、再試行回数などを確認できます。
こんな感じ
スクリーンショット 2025-10-18 111532.png


🧩 よく出てくる用語まとめ

用語 意味
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出力などを非同期化していきたいと思います。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?