はじめに
Railsで非同期処理をする時の選択肢として Sidekiq はよく挙がるかと思います。自分も例に漏れず普段からお世話になっているものの、一から構築したことがなかったためローカル環境に構築してみました。今回は構築手順を残していこうと思います。
なお、Sidekiqの概要については以下の記事がわかりやすいため、こちらをご参照ください。
Sidekiqを構築する
すでにRailsアプリケーションが作られていることを前提に始めます。
Railsアプリケーションのテンプレートを作っていたので、こちらを元に構築を行いました。今回実装したコードは以下に残してあります。
Comparing main...setup_sidekiq · hideki-okawa/rails-graphql-playground · GitHub
Redisの構築
docker-composeでRedisを構築します。docker-compose.yml
を作成し、Redisのサービスを追加します。
version: '3' services: redis: image: redis:latest ports: - "6379:6379"
docker composeを起動します。
$ docker compose up --build
Sidekiqをセットアップする
Gemfile
にsidekiqを追加します。
gem 'sidekiq'
インストールします。
$ bundle install
ActiveJobを利用するため、Sidekiqをアダプタとして設定します。
config.active_job.queue_adapter = :sidekiq
Jobクラスを生成する
コマンドでJobを自動生成します。
$ rails generate job Example
jobs/example_job.rb
が自動生成されます。Jobが実行されることを確認するため、雑にputsを仕込んでおきます。
class ExampleJob < ApplicationJob queue_as :default def perform(*args) # Do something later puts 'ExampleJob is running!!' end end
Jobを実行してみる
あらかじめSidekiqを立ち上げておきます。
$ bundle exec sidekiq m, `$b .ss, $$: .,d$ `$$P,d$P' .,md$P"' ,$$$$$b/md$$$P^' .d$$$$$$/$$$P' $$^' `"/$$$' ____ _ _ _ _ $: ',$$: / ___|(_) __| | ___| | _(_) __ _ `b :$$ \___ \| |/ _` |/ _ \ |/ / |/ _` | $$: ___) | | (_| | __/ <| | (_| | $$ |____/|_|\__,_|\___|_|\_\_|\__, | .d$$ |_| 2024-01-24T13:20:21.537Z pid=3769 tid=5m5 INFO: Booted Rails 7.0.6 application in development environment
別のターミナルでJobを実行してみます。
> ExampleJob.perform_later Enqueued ExampleJob (Job ID: ea2b30a8-e8b1-4c87-be53-867c34f43cba) to Sidekiq(default) => #<ExampleJob:0x000000010df33528 @arguments=[], @exception_executions={}, @executions=0, @job_id="ea2b30a8-e8b1-4c87-be53-867c34f43cba", @priority=nil, @provider_job_id="975407bf932e5097267b8523", @queue_name="default", @successfully_enqueued=true, @timezone="UTC">
Sidekiq側でJobが実行されていることを確認できました!
2024-01-24T13:23:21.444Z pid=3769 tid=7ld class=ExampleJob jid=975407bf932e5097267b8523 INFO: start 2024-01-24T13:23:21.449Z pid=3769 tid=7ld class=ExampleJob jid=975407bf932e5097267b8523 INFO: Performing ExampleJob (Job ID: ea2b30a8-e8b1-4c87-be53-867c34f43cba) from Sidekiq(default) enqueued at 2024-01-24T13:23:21Z ExampleJob is running!! 2024-01-24T13:23:21.449Z pid=3769 tid=7ld class=ExampleJob jid=975407bf932e5097267b8523 INFO: Performed ExampleJob (Job ID: ea2b30a8-e8b1-4c87-be53-867c34f43cba) from Sidekiq(default) in 0.3ms 2024-01-24T13:23:21.450Z pid=3769 tid=7ld class=ExampleJob jid=975407bf932e5097267b8523 elapsed=0.006 INFO: done
管理画面にアクセスする
管理画面でJobの状況を確認できるため設定を行います。
config/routes.rb
に以下の設定を追加します。
require 'sidekiq/web' Rails.application.routes.draw do ... mount Sidekiq::Web => "/sidekiq" # mount Sidekiq::Web in your Rails app end
http://localhost:3000/sidekiq にアクセスすると管理画面が確認できます。
おわりに
今回はSidekiqを構築してみました。Sidekiqについては業務では既存コードを参考にしながら実装すること部分が多く、改めて一から構築することで理解が深まりました。今後もお世話になっていこうと思います。