LoginSignup
169

More than 3 years have passed since last update.

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

Last updated at Posted at 2014-12-21

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

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
169