動かざることバグの如し

近づきたいよ 君の理想に

1分でRailsにSidekiqを導入するまでの手順

環境

  • Rails 5.x
    • 6でも同じ 4は知らん
  • ruby 2.x

手順

早速やっていく

ここでは

  • localのRedisサーバーにSidekiqを使う
  • 混合しがちだが、SidekiqのWorkerは使わずRailsのActiveJobでJobを走らせる。

Gemfileに以下を追加

gem "sidekiq"
gem 'redis-namespace'

config/sidekiq.ymlを作成して以下

:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 1
:queues:
  - capture
:retry: false
  • concurrency: 並列数
  • queues: 後述するキュー名 無指定だとdefaultだが混乱の元なので明示するように
  • retry: falseなのはリトライ処理はSidekiq側ではなくActiveJob側で制御したいため

Jobの作成

rails generate job capture

typoしてしまったとかで削除したいときは destroy

rails destroy job capture

すると app/jobs/capture_job.rb が作成される

例えば以下に書き換える

class CaptureJob < ApplicationJob
  queue_as :capture

  def perform(id)
    p id
  end
end

config/application.rb にて以下設定

config.active_job.queue_adapter = :sidekiq

最後にSidekiqが接続するRedisを記述 コンフリクトしないようにnamespaceで分けると吉

Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://localhost:6379', namespace: "sample_sidekiq" }
end
Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://localhost:6379', namespace: "sample_sidekiq" }
end

実行

bundle exec sidekiq -C config/sidekiq.yml

を実行したあとに

CaptureJob.perform_later(1234)

とかでいける