Sidekiqの動作を理解するために、手元で簡単な動作確認をしました。
その手順を残します。
SidekiqはRuby向けのバックグラウンドジョブ。
スレッドを使用して、同じプロセス内で複数のジョブを同時に処理することが可能。
動作確認
手順
環境準備
# Redisインストール
brew install redis
brew services start redis
# ディレクトリ作成
mkdir sidekiq
cd sidekiq
# gemのinstall
bundle install
Gemfileの作成
source 'https://rubygems.org'
gem 'sidekiq', '~> 7.0'
gem 'redis', '~> 5.0'
サンプルコードの作成
Workerクラスの作成
sidekiq/worker.rb
require 'sidekiq'
# Redisの接続設定
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://localhost:6379' }
end
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://localhost:6379' }
end
# Workerクラス
class SampleWorker
include Sidekiq::Worker
def perform(name, count)
count.times do |i|
puts "こんにちは、#{name}さん! (#{i + 1}回目)"
sleep 1
end
puts "#{name}さんへの処理が完了しました!"
end
end
エンキュー用スクリプト
sidekiq/enqueue_jobs.rb
require_relative 'worker'
# ジョブをキューに追加
puts "ジョブをキューに追加しています..."
# 基本的なジョブの追加
SampleWorker.perform_async("太郎", 3)
SampleWorker.perform_async("花子", 2)
# 5秒後に実行するジョブ
SampleWorker.perform_in(5, "次郎", 2)
puts "ジョブの追加が完了しました!"
puts "Sidekiqサーバーでジョブが処理されるのを確認してください。"
動作確認
ターミナルを2つ開いて実行
ターミナル1(Sidekiqサーバーの起動)
bundle exec sidekiq -r ./worker.rb
ターミナル2(ジョブの追加)
ruby enqueue_jobs.rb
実行ログ
実行
$ ruby enqueue_jobs.rb
ジョブをキューに追加しています...
太郎さんにジョブを追加しています...
花子さんにジョブを追加しています...
100秒後に実行する次郎さんのジョブを追加しています...
ジョブの追加が完了しました!
Sidekiqサーバーでジョブが処理されるのを確認してください。
Sidekiqログ
2025-09-07T07:16:33.397Z pid=10357 tid=6fd class=SampleWorker jid=d300ccc10a60fbb682191c2c INFO: start
こんにちは、太郎さん! (1回目)
2025-09-07T07:16:33.397Z pid=10357 tid=6lh class=SampleWorker jid=0538ef698bc91b27f254f122 INFO: start
こんにちは、花子さん! (1回目)
こんにちは、太郎さん! (2回目)
こんにちは、花子さん! (2回目)
こんにちは、太郎さん! (3回目)
花子さんへの処理が完了しました!
2025-09-07T07:16:35.408Z pid=10357 tid=6lh class=SampleWorker jid=0538ef698bc91b27f254f122 elapsed=2.011 INFO: done
太郎さんへの処理が完了しました!
2025-09-07T07:16:36.409Z pid=10357 tid=6fd class=SampleWorker jid=d300ccc10a60fbb682191c2c elapsed=3.013 INFO: done
2025-09-07T07:16:55.530Z pid=10357 tid=6lh class=SampleWorker jid=01862a939a0656e6b70a34f6 INFO: start
こんにちは、次郎さん! (1回目)
こんにちは、次郎さん! (2回目)
次郎さんへの処理が完了しました!
2025-09-07T07:16:57.541Z pid=10357 tid=6lh class=SampleWorker jid=01862a939a0656e6b70a34f6 elapsed=2.011 INFO: done
2025-09-07T07:17:38.184Z pid=10357 tid=6kx class=SampleWorker jid=e6833d182dbab576c3a0a796 INFO: start
こんにちは、次郎さん! (1回目)
こんにちは、次郎さん! (2回目)
次郎さんへの処理が完了しました!
2025-09-07T07:17:40.197Z pid=10357 tid=6kx class=SampleWorker jid=e6833d182dbab576c3a0a796 elapsed=2.012 INFO: done
備忘録
Redisの接続設定について
# 2つの役割
# ジョブをキューに追加する側のプロセス
# 例:Worker.perform_async("データ") を実行するプロセス
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://localhost:6379' }
end
# ジョブを実際に実行する側のプロセス
# 例:bundle exec sidekiq で起動するプロセス
# キューからジョブを取り出して実行する
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://localhost:6379' }
end
[クライアント] [Redis] [Sidekiqサーバー]
| | |
|---(ジョブ追加)------->| |
| perform_async |<---(ジョブ取得)----------|
| | ジョブを処理 |
configure_client設定 両方が接続 configure_server設定
Sidekiqサーバー起動時の流れ
bundle exec sidekiq
# Gemfileに記載されたバージョンのSidekiqを実行
# Sidekiqサーバープロセスを起動
# Redisからジョブを取り出して実行する常駐プロセス
# 1. Sidekiqプロセスが起動
# 2. worker.rbを読み込み(Workerクラスが登録される)
# 3. Redisに接続
# 4. ジョブの監視を開始
# 5. ジョブが来たら、該当するWorkerのperformメソッドを実行
[Terminal 1: Sidekiqサーバー]
bundle exec sidekiq -r ./worker.rb
↓
Redisを監視開始
↓
ジョブを待機中...
↓
ジョブを検知!
↓
EmailWorker.new.perform("test@example.com")を実行
↓
完了、次のジョブを待機...
[Terminal 2: ジョブ投入]
ruby enqueue_jobs.rb
↓
EmailWorker.perform_async("test@example.com")
↓
Redisにジョブを追加