はじめに
イタンジ株式会社の藤崎です。現在は、物件データ基盤の開発を担当しています。
年末年始は、本を読んだり、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 に公開してあります。
この記事ではこれをいくつかのステップに別け、解説していく形となります。
- Redisサーバーを建てる
- Sidekiqをインストール
- Sidekiqサーバーを建てる
- ジョブを実行する
- (おまけ) 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のバージョンによって引数の取り扱いが異なるので実際に試してみると面白いかもしれません。