🙆

[Rails] sidekiqで非同期処理を実装する

2021/05/02に公開

[問題] Railsで非同期処理を実装したい

Railsで非同期処理と言えばsidekiqだと思っているのでその使い方を解説します。

環境・前提

  • ruby 2.7.2
  • Rails 5.2.4
  • redisを導入済み。起動できる

[解決策] sidekiqを導入する

Gemfileに記載してbundle install

gem 'sidekiq'
bundle install

config/application.rbを書き換える

Job管理にはsidekiqを使うよ!というのを定義します。

module App
  class Application < Rails::Application
    # ...省略...
    config.active_job.queue_adapter = :sidekiq
  end
end

config/initializes/sidekiq.rbを書く

ここに接続先の情報を書きます。serverとclientの違いはよくわかっていません。dockerを使う人はlocalhostでは通じないと思うので適宜読み替えてください。

Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://localhost:6379' }
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://localhost:6379' }
end

(今回はしない) そのほかの細かい設定を書く

今回は特に何もしませんが、config/sidekiq.ymlという設定ファイルを記述したら良い感じに色々やってくれます。

---
:concurrency: 5
staging:
  :concurrency: 10
production:
  :concurrency: 20
:queues:
  - critical
  - default
  - low

https://github.com/mperham/sidekiq/wiki/Advanced-Options

サンプルコードを生成してみる

rails g jobで生成できます。

rails g job sample

完了したら、以下のようなapp/job/sample_job.rbができているはずです。
このperformメソッドにしたい処理をかきます。putsなんかで表示を確かめてみるとわかりやすいと思います。

class SampleJob < ApplicationJob
  queue_as :default

  def perform(*args)
    # Do something later
    puts 'ジョブを実行した'
  end
end

実行を確認するために適当なコントローラーに実行文を書いてみましょう。(たまたまHomeコントローラーがあったのでそこに記載しました)

perform_later以外にも色々ありますが、今回は導入が目的なので一旦スルーします。

class HomeController < ApplicationController
  def index
    SampleJob.perform_later
  end
end

sidekiqのサーバーを起動する

ジョブを受け付けて実行するするためのサーバーを起動します。そのままログが表示されると思いますが、エラーがでていなければいつでもOKです。

bundle exec sidekiq 

バックグラウンドで実行する場合はこんな感じですが↓、話が細かくなるので今回はフォアで実行するだけにします。

bundle exec sidekiq --daemon

コントローラーに対応するURLにアクセスするかrails cで確かめる

あとはコントローラにアクセスして実行できていそうか確かめましょう。

rails cからでも実行して確かめられます。

% rails c
irb(main):001:0> SampleJob.perform_later
Enqueued SampleJob (Job ID: 734bd2f2-e1cd-420e-918a-2d67a2f15faf) to Sidekiq(default)
=> #<SampleJob:0x00005652a67b4400 @arguments=[], @job_id="734bd2f2-e1cd-420e-918a-2d67a2f15faf", @queue_name="default", @priority=nil, @executions=0, @provider_job_id="d91d9681e1b70429b7559b06">

sidekiqのログを見る

今回サンプルの実行命令はputsを書いたので、sidekiqのログをみてみると、putsで書いた内容が表示されていると思います。

終わったら、ctrl+cで抜ければsidekiqを停止できます。

参考サイト

https://github.com/mperham/sidekiq/wiki

Discussion