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 をご覧下さい。