🙆
[Rails] sidekiqで非同期処理を実装する
[問題] 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
サンプルコードを生成してみる
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を停止できます。
参考サイト
Discussion