Railsで開発をしているとだいたいSidekiqという言葉を耳にする。Sidekiqとは一体どういうものなのかこの記事でまとめておく。
Sidekiqの概要
Sidekiqは、RubyやRailsアプリケーション向けのバックグラウンドジョブ処理ツール。特に時間がかかる処理や非同期で実行したいタスクをアプリケーションとは別に実行するために使用される。
また、このSidekiqを使用するにはRedisというNoSQLデーターベースを使用してジョブを管理する。これによりジョブの管理、再思考を効率的に行うことができる。
Sidekiqの基本的な使い方
Sidekiqの基本的な使い方をまとめておく。
Sidekiqをインストールする
# Gemfile
gem 'sidekiq'
bundle install
でgemをインストールする。
Redisをインストールする
SidekiqはRedisを使用するため、ローカルにRedisをインストールしておく必要がある。
brew install redis
brew services start redis
homebrewを使用するならこんな感じ。
Workerクラスを作成する
実際に実行したいジョブのクラスを作成する。
# app/workers/hard_worker.rb
class HardWorker
include Sidekiq::Worker
def perform(name, count)
puts "Doing hard work for #{name}, #{count} times!"
end
end
このクラス名はWorkerという命名をしなくても問題ない。ただ、このジョブがどのようなものなのかを判別できるものであれば良い。例えば、SendEmailというようなものなど。このような命名であれば、ジョブとしてメールをバックグラウンドで送信するジョブかぁと瞬時に判断できる。
作成したジョブをキューイングする
上記で作成したジョブのクラスを呼び出してキューイングをする。
HardWorker.perform_async('Bob', 5)
このような感じでジョブを実行したいところでHardWorkerクラスを呼び出す。そして、perform_asyncメソッドを使用することで非同期でこのジョブがキューに追加されるようになる。もし引数を設定する必要があるのであれば、引数を渡してあげる。
他にもジョブを実装する上でperform_later
というメソッドを使用することがあるが、これはActiveJobを継承している場合に使用することができる。
Sidekiqダッシュボードを利用する
Sidekiqにはダッシュボードが用意されている。こんな感じのやつ。
これを表示して視覚的にジョブの状態を把握するためにroutes.rbに以下を追加する。
# config/routes.rb
require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'
これで/sidekiqにアクセスすることでダッシュボードを確認できる。
Sidekiqのジョブオプションについて
class HardWorker
include Sidekiq::Worker
sidekiq_options retry: 5, queue: 'critical'
def perform(name, count)
# 処理内容
end
end
先ほどWorkerクラスを作成したが、そのクラスにはオプションを設定することができる。
sidekiq_options retry: 5, queue: 'critical'
retry: 5
これは再試行を5回することができるという例。何かのエラーでジョブの実行がうまくいかなかった場合に5回までは再試行するようというオプション。ちなみにこのretry回数は、config/sidekiq.yml内でもdefualtのretry回数を設定しておくことができる。また、retryとなった場合にも冪等性が担保されるようにする必要があるため注意が必要。(何度実行しても同じ結果となるようにすること)
queue: ‘critical’
これはこのジョブの優先度を表す。他のジョブと比べてどちらを先に処理するべきかを判断する。critical、default、lowがだいたい使用され、これはconfig/sidekiq.yml内で重み付けの設定可能。こちらを詳しく知りたい方は調べてみるのをお勧めする。
まとめ
sidekiqを導入するにあたり基本的な処理の流れは以下。
- sidekiqのgemを追加してインストールする。
- Redisをインストールして起動する。
- ジョブとして使用するクラス(Workerクラス)を作成し、
perform
メソッドに処理を書く。 - ジョブを非同期でキューイング
perform_async
する。 - Sidekiqでジョブが処理される。
- 必要があればダッシュボードでジョブのステータスを監視する。
以上のような流れでSidekiqを利用し、ジョブをバックグラウンドで非同期実行することが可能となる。