自転車とプログラミング

元自転車メーカーのマーケター、今は自社開発企業に勤めるエンジニアが主にプログラミングの話を書きます。

sidekiqとは何か。 概要とか調べたことまとめ

仕事でsidekiqに触れたので調べたことをまとめました。

sidekiqとは何か?

sidekiqとはバックグラウンドジョブ管理gemです。

バックグラウンドジョブとは重い処理をバックグラウンド処理してユーザー(クライアント)の処理待ち時間を削減したり、リソースの浮いた時間帯に重い処理を回したりするなどできるようにするもの。ユーザー体験が良くなると言われています。

sidekiqはRubyで書かれたマルチスレッド処理でジョブを並列実行する仕組みになっています。1プロセスあたりマルチスレッドかつ、1スレッドが1ジョブを実行します。デフォルトでは25スレッドが上限となっています。 ジョブがプロセスに依存しないため、メモリにロードしたデータを複数ジョブで流用することができる点で、メモリ効率が競合ライブラリよりも優れているようです。

また、ジョブ管理はRedis(メモリ)を使用します。

実行フロー

sidekiqはRuby gemとしてRailsプロジェクト(に限りませんが)にインストールして使用します。

起動時はRailsアプリケーションと並行してsidekiqクライアントを bundle exec sidekiq -C sidekiq.yml して起動します。別プロセスでsidekiqは動作し、Railsアプリケーションとは異なる動きでジョブを管理・実行します。

大まかな処理フローは以下の通りです。

  1. クライアントが重い処理をリクエスト(帳票発行やメール多数送信など)
  2. Railsアプリケーションは対ユーザーとジョブ管理とで処理を分ける
    1. ユーザー:処理を受け付けたことをレスポンスする
    2. ジョブ:Railsアプリケーションからsidekiqに組み込んだジョブクラスを呼び出して非同期ジョブを呼び出し
  3. sidekiqはRailsアプリケーションからの呼び出しをもとにジョブをキュー(Redis)に登録 ※キュー以外にも時限実行とかもある。
  4. キューに蓄積されたジョブが順次実行される ※同時実行数はsidekiqで定義できる
    1. ジョブの順番が来たらあらかじめ定義済みのジョブが実行され、Railsアプリケーションの処理が呼び出される
  5. ジョブが完了したら終了、もしくは完了しない場合は再実行される

実装

公式のGetting StartedとRails Guideに目を通すと良いと思います。

github.com

railsguides.jp

Active Jobはジョブ管理gemの抽象化ライブラリなので、使うとジョブ周りの実装が若干楽になるのかな?個人的には素のsidekiqでもシンプルだと思うのでどちらも使いやすいと思います。

アプリケーション起動時から動作する繰り返しジョブの実装

個人的にやりたかったところがこれです。アプリケーションを起動した直後から起動している間は一定間隔で実行されるジョブをsidekiqで実装したいな、と。

ジョブの実装に関しては通常のRailsアプリ、sidekiq使用時と変わりません。Railsアプリ上に実装し、sidekiqなりActive Jobから処理を叩けるようにしておきます。

ジョブのスケジューリングはsidekiq-cronというgemを追加で入れて使用します。繰り返し処理とかを設定できるgemです。

また、sidekiqのジョブ実行の前段階としてジョブの登録が必須になります。これをアプリケーション起動時にどうするかというと、sidekiqのジョブ登録はDBに行うので bundle exec rails db:seed をアプリケーション起動前に実行しDBにジョブを登録してからアプリケーションを起動するようにします。 sidekiqのジョブレコードと、ジョブレコードに対応したsidekiq-cronのスケジューリングレコードをDBに登録するようにします。

これでアプリケーションを起動すると一定間隔でジョブを実行するようになります。