Ruby
Rails
Gem

Railsで非同期処理を行える「Sidekiq」

More than 3 years have passed since last update.


Sidekiqとは?

Sidekiqは、resqueやdelayed_jobなどのような非同期処理を行いたい時に使うライブラリです。複数のジョブを同時に実行することにより、メモリを節約すること可能です。


公式リポジトリ

side.png

sidekiq


redisをインストール

Sidekiq には、Redisがバックグラウンド(ジョブ管理)に必要なのでインストールしておきます。

# Homebrewを利用してインストール(Mac)

$ brew install redis
# yumでインストール(CentOS)
$ yum install redis

redisのインストールはこの辺り記事を参考にしてみてください。

redisサーバー構築メモ

MacにRedisをインストールする


Sidekiq をインストール


Gemfile

gem 'sidekiq'

gem 'sinatra', require: false # ダッシュボードを利用するため

$ bundle install --path vendor/bundle

で gem をインストールします。

起動時の設定


config/initializers/sidekiq.rb


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種類の設定を追記します。


セットアップ


config/sidekiq.yml

:verbose: false

:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 10
:queues:
- default
- test


Worker を実装


app/workers/test_worker.rb

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 の中に非同期で行いたい処理を書きました。


呼び出す


app/controllers/home_controller.rb

def show

HardWorker.perform_async('美味礼賛')
end

コントローラ側に記述しました。


起動コマンド

config 以下に書いた、設定ファイルを読み込んで起動させます。

$ bundle exec sidekiq -C config/sidekiq.yml

バックグラウンドで動かす際はこちら。

$ bundle exec sidekiq -C config/sidekiq.yml -d

Sidekiq 起動して、バックグラウンドで動かします。5回連続でアクセスしてみる...

bimi.png

動いてますね。


管理画面


config/routes.rb

   require 'sidekiq/web'

mount Sidekiq::Web, at: "/sidekiq"

管理画面を作成するためにmountします。http://localhost:3000/sidekiq にアクセスすると...

sidekiq_mount.png


デプロイ

capistranoを使用している場合は、デプロイ時に Sidekiq がロードしているコードが更新されないため、下記の設定を追記して、デプロイと同時に再起動されるように設定します。


config/Capfile

require 'capistrano/sidekiq'



config/deploy.rb

set :sidekiq_role, :web


細かい設定は Sidekiq wiki をご覧下さい。