SidekiqをRailsなしで使ってみる

はじめに

イタンジ株式会社の藤崎です。現在は、物件データ基盤の開発を担当しています。

年末年始は、本を読んだり、AWS ECSで遊んでみたり、Gemのソースコードを読んでみたりと色々やっていました。

今回はその色々やった中でも簡単に紹介できそうな、「SidekiqをRailsなしで使ってみる」をテーマに書こうと思います。

モチベーション

SidekiqはよくRailsと一緒に使われることが多く、Sidekiq関連の記事ではRails前提のものが多い印象です。

しかし、ちょっとした検証をするためだけにRailsアプリケーションを作成するというのは面倒です。

そこで、RailsなしでSidekiqを使用できるシンプルな環境があれば便利だな、と思ったのがきっかけでした。

なお、Sidekiqとはバックグラウンドジョブを処理するためのフレームワークです。 ここではSidekiqそのもについては解説しないため、詳しくはGithubで公開されているwiki等をご参照ください。

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

注意

今回使用するSidekiqのバージョンは「7」です。 バージョンによってジョブの引数の取り扱い方や、ジョブの定義方法が違うためご注意ください。

SidekiqをRailsなしで使ってみる

今回紹介するソースコードは、https://github.com/akito-fujisaki/sidekiq-without-rails-sample に公開してあります。

この記事ではこれをいくつかのステップに別け、解説していく形となります。

  1. Redisサーバーを建てる
  2. Sidekiqをインストール
  3. Sidekiqサーバーを建てる
  4. ジョブを実行する
  5. (おまけ) Sidekiqダッシュボードを建てる

使用バージョンは下記となります。

  • ruby: 3.2.0
  • sidekiq: 7.0.3
  • redis: 7

1. Gemをインストール

Gemfileを用意し、bundle installしてください。

# Gemfile
source 'https://rubygems.org'

gem 'sidekiq', '~> 7'

2. Redisサーバーを建てる

SidekiqはRedis (https://redis.io/) を使用して、すべてのジョブと運用データを保存しています。

今回はDockerを使用してRedisサーバーを建てます。

お好きなディレクトリに下記のようなcompose.ymlを用意してください。

# compose.yml
version: "3"

services:
  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data
    ports:
      - 6379:6379
    command: redis-server --appendonly yes

volumes:
  redis-data:
    driver: local

用意できたら起動しておきます。

$ docker compose up

ログを確認したいためフォアグラウンドで起動していますが、-dオプションをつけてバックグラウンドで起動しても問題ありません。

6379ポートで待機しているため、ncコマンド等を使用して疎通確認しておきましょう。

$ nc -l 6379

# => nc: Address already in use

3. Sidekiqサーバーを建てる

ジョブを処理するためのSidekiqサーバーを建てます。

3.1 application.rbを用意する

application.rbを用意し、下記のように記述してください。解説は後述します。

# application.rb
require 'sidekiq'

redis_config = { url: 'redis://localhost:6379' }

Sidekiq.configure_server do |config|
  config.redis = redis_config
end

Sidekiq.configure_client do |config|
  config.redis = redis_config
end

class SampleJob
  include Sidekiq::Job

  def perform(params)
    pp params
  end
end

SidekiqがRedisを使用するための接続情報

redis_url = 'redis://localhost:6379'

Sidekiq.configure_server do |config|
  config.redis = { url: redis_url}
end

Sidekiq.configure_client do |config|
  config.redis = { url: redis_url}
end

SidekiqがRedisを使用するための接続情報を設定しています。

今回はDockerを使用してRedisサーバーを建てているので、URLはredis://localhost:6379を指定します。

URLの指定がない場合はSidekiqはデフォルトでこのURLを見に行くようですが、今回は明示的に記載しておくこととします。

ジョブの定義

class SampleJob
  include Sidekiq::Job

  def perform(params)
    puts "params: #{params}"
  end
end

ジョブを定義します。 与えられた引数を標準出力へ出力するだけのシンプルなものです。これで実行できたかどうかを目視で確認することができます。

Railsではapp/jobs配下におくことが多いですが、今回は1つのファイル内で記述してしまいます。

3.2 Sidekiqサーバーを起動する

先程作成したapplication.rb-rオプションで指定して、sidekiqを起動します。

(厳密には違うかもしれまんせんが)Rubyの-rオプションと同様で、指定したファイルをrequireしてくれます。

$ bundle exec sidekiq -r ./application.rb

使用できる他のオプションはbundle exec sidekiq --helpで確認できます。

4. ジョブを実行する

RedisサーバーとSidekiqサーバーを建て終わったので、いよいよジョブを実行してみます。

-rオプションでapplication.rbを指定して、irbを起動します。

$ bundle exec irb -r ./application.rb

irb内で、定義したジョブをキューに積んでみます。

irb(main)> SampleJob.perform_async({ 'name' => 'hoge'})

=> "664a8c2dcd13c616a126ffe4"

すると、先程起動したSidekiqサーバーのログで下記のように表示されます。

2023-01-15T09:13:27.274Z pid=41649 tid=xrh class=SampleJob jid=664a8c2dcd13c616a126ffe4 INFO: start
params: {"a"=>"hoge"}

これで、SidekiqをRailsなしで使用できる環境を作成することができました。

5. (おまけ) Sidekiqダッシュボードを建てる

Sidekiqではジョブの実行状況等をWebで確認できるダッシュボードがあります。

今回は、これもRailsを使わずにRackを使って表示させてみようと思います。

詳しくは公式Wikiが参考になります。

https://github.com/mperham/sidekiq/wiki/Monitoring#standalone

5.1 Rackのインストール

Gemfileに必要なGemを追記し、bundle installします。

Sidekiqのダッシュボードはセッションを管理しているため、rack-sessionが必要となります。

また、rackupコマンドはrackとは別で管理されるようになったため、こちらも忘れずに記載しおきましょう。

# Gemfile
gem 'rack'
gem 'rack-session'
gem 'rackup'

5.2 config.ruを用意

アプリケーションを起動するために、config.ruを用意します。

require 'bundler/setup'

Bundler.require(:default)

require 'securerandom'
require 'sidekiq/web'

use Rack::Session::Cookie, secret: SecureRandom.hex(32), same_site: true, max_age: 86400
run Sidekiq::Web

5.3 アプリケーションを起動

rackupコマンドでアプリケーションを起動します。なお、デフォルトでは9292ポートが使用されます。

$ bundle exec rackup

[2023-01-15 19:23:20] INFO  WEBrick 1.7.0
[2023-01-15 19:23:20] INFO  ruby 3.1.2 (2022-04-12) [arm64-darwin21]
[2023-01-15 19:23:20] INFO  WEBrick::HTTPServer#start: pid=45737 port=9292

http://localhost:9292にアクセスすることで、ダッシュボードを確認することができるようになりました。

おわりに

今回はSidekiqをRailsなしで使用できる環境を作成してみました。

普段はRailsと一緒に使用する機会が多いものですが、こうして単体で使用してみることで、Sidekiqだけに焦点を絞った勉強や検証を行うことができるようになりました。

冒頭でも触れましたが、Sidekiqのバージョンによって引数の取り扱いが異なるので実際に試してみると面白いかもしれません。