Sidekiqとは?
Sidekiqは、resqueやdelayed_jobなどのような非同期処理を行いたい時に使うライブラリです。複数のジョブを同時に実行することにより、メモリを節約すること可能です。
公式リポジトリ
redisをインストール
Sidekiq には、Redisがバックグラウンド(ジョブ管理)に必要なのでインストールしておきます。
# Homebrewを利用してインストール(Mac)
$ brew install redis
# yumでインストール(CentOS)
$ yum install redis
redisのインストールはこの辺り記事を参考にしてみてください。
→ redisサーバー構築メモ
→ MacにRedisをインストールする
Sidekiq をインストール
gem 'sidekiq'
gem 'sinatra', require: false # ダッシュボードを利用するため
$ bundle install --path vendor/bundle
で gem をインストールします。
起動時の設定
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end
サーバー側とクライアント側の2種類の設定を追記します。
セットアップ
:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 10
:queues:
- default
- test
Worker を実装
class TestWorker < ApplicationController
include Sidekiq::Worker
sidekiq_options queue: :test, retry: 5
def perform(title)
p 'work: title=' + title
end
end
sidekiq_options の queue に default 以外に名前をつけることもできて、今回は test という名前を付与しました。何も書かないと default が名前になります。
リトライさせたくない場合は、retry: false と記述します。非同期処理のクラスは Sidekiq::Worker を include して作成。 perform の中に非同期で行いたい処理を書きました。
呼び出す
def show
TestWorker.perform_async('美味礼賛')
end
コントローラ側に記述しました。
起動コマンド
config 以下に書いた、設定ファイルを読み込んで起動させます。
$ bundle exec sidekiq -C config/sidekiq.yml
バックグラウンドで動かす際はこちら。
$ bundle exec sidekiq -C config/sidekiq.yml -d
Sidekiq 起動して、バックグラウンドで動かします。5回連続でアクセスしてみる...
動いてますね。
管理画面
require 'sidekiq/web'
mount Sidekiq::Web, at: "/sidekiq"
管理画面を作成するためにmountします。http://localhost:3000/sidekiq にアクセスすると...
デプロイ
capistranoを使用している場合は、デプロイ時に Sidekiq がロードしているコードが更新されないため、下記の設定を追記して、デプロイと同時に再起動されるように設定します。
require 'capistrano/sidekiq'
set :sidekiq_role, :web
細かい設定は Sidekiq wiki をご覧下さい。