とーますメモ

Ruby on Rails / Goなどの学習メモ

【Rails】Sidekiqを使用してみた。

自分用メモ

ActiveJob経由か、直接使うかは
以下の記事で詳細を書いた。
thoames.hatenadiary.jp

自分の場合は、フルにSidekiqの機能を使用したかったため
直接Sidekiqを使用する」方法を取る。

インストール

Gemfile

gem 'sidekiq'
gem 'redis-namespace'

[注意] Redisの設定にnamespaceを設定している場合、
'redis-namespace'のgemをインストールしていいないと、
以下のエラーが出る。

ERROR: Your Redis configuration uses the namespace 'xxxxxxxxx'
but the redis-namespace gem is not included in the Gemfile.
Add the gem to your Gemfile to continue using a namespace. 
Otherwise, remove the namespace parameter.

[参考]
Sidekiq - DesignAssembler

実行

設定ファイルを読み込んで起動する場合

$ bundle exec sidekiq -C config/sidekiq.yml

ベストプラクティス

以下のようにオブジェクトを渡した後、キューが実行される前に
そのオブジェクトが変わった場合、
意図したものと違う内容が実行されてしまう可能性がある。
またRedisにデータを保存する時、引数の情報がJSONとして保存される。
(内部ではRedisに保存するときに、JSON.dumpを使用し、
Redisからデータを参照するときにJSON.loadを使用している)

このため、perform_asyncに渡す引数は必ずJSONとして保存できる
「string, integer, float, boolean, null, array and hash」のいずれかでなければならない。
シンボルやオブジェクト(dateやtimeなども)は引数にしてはいけない。

そのため、処理を特定できる識別子(IDなど)を引数として設定し、
キュー処理の内部で、IDを用い処理を行うことが推奨されている。

✕: 悪い例

quote = Quote.find(quote_id)
SomeWorker.perform_async(quote)

○: 良い例

SomeWorker.perform_async(quote_id)

Best Practices · mperham/sidekiq Wiki · GitHub

リトライ

例外を発生させれば、自動的にリトライが走る。

class HogeJob < ActiveJob::Base
  queue_as :default

  def perform(hoge_id:)
    raise "error" # 明示的に例外投げる
  end
end

[参考]
Sidekiq で最大回数リトライ後に失敗した場合出すログに例外のバックトレースを含める - Qiita
sidekiqのリトライ回数は26回以上を指定できる - PartyIX
Delayed::Job で絶対にやっておいた方がいいたった1つの設定

ベーシック認証

require 'sidekiq/web'

Sidekiq::Web.use Rack::Auth::Basic do |username, password|
  username == 'basicuser' && password == 'basicpass'
end
mount Sidekiq::Web => '/sidekiq'

プラグイン

sidekiq-failures

GitHub - mhfs/sidekiq-failures: Keep track of Sidekiq failed jobs

失敗したジョブの詳細をWebUIで見ることができる。
デフォルトだと最新の失敗を、1000個まで確認できる。

以下のヘルパーメソッドは便利そう

Sidekiq::Failures.count
Sidekiq::Failures.reset_failures
sidekiq-history

GitHub - russ/sidekiq-history: Sidekiq History

ダッシュボードの拡張。
種類に関係なく全ジョブの履歴ログを見ることができるようになる。
デフォルトだと最新の履歴ログを、1000個まで確認できる。

sidekiq-statistic

GitHub - davydovanton/sidekiq-statistic: See statistic about your workers

ダッシュボードの拡張。
解析用画面がWebUIに追加される。
グラフで成功、失敗したJobの確認ができたり
解析用のAPIが使えるようになる。

sidekiq-unique-jobs

GitHub - mhenrixon/sidekiq-unique-jobs: The missing unique jobs in sidekiq

The job will be unique for the number of seconds configured (default 30 minutes) or until the job has been completed.
Thus, the job will be unique for the shorter of the two.

同じJobが複数登録された場合、それを1つのJobにするっぽい。
デフォルトだと30分。

capistrano-sidekiq

GitHub - seuros/capistrano-sidekiq: Sidekiq integration for Capistrano

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

config/Capfile

require 'capistrano/sidekiq'

config/deploy.rb

set :sidekiq_role, :web

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

[参考]
Sidekiqで非業の死を遂げたキューを知る方法 - Qiita
Railsで非同期処理:キュー。Sidekiq(+ActiveJob)がResqueよりも、とても簡単便利。 - Qiita
capistrano-sidekiqを使うのをやめる - Qiita