なんて美しい夕陽だ🌇

プログラミング、日常、忘れないように書いていきます

Railsで非同期処理!Sidekiqを構築してみる🦶

はじめに

Railsで非同期処理をする時の選択肢として Sidekiq はよく挙がるかと思います。自分も例に漏れず普段からお世話になっているものの、一から構築したことがなかったためローカル環境に構築してみました。今回は構築手順を残していこうと思います。

なお、Sidekiqの概要については以下の記事がわかりやすいため、こちらをご参照ください。

zenn.dev

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については業務では既存コードを参考にしながら実装すること部分が多く、改めて一から構築することで理解が深まりました。今後もお世話になっていこうと思います。