Ruby on Rails向けSidekiq入門

Sidekiqは、Ruby開発者が時間を要するタスクをバックグラウンドに移行することで、高速で応答性の高いWebアプリケーションを維持することを可能にします。

マルチスレッディングを核として、Sidekiqは一度に多数のジョブを処理できます。これにより、重い負荷を扱ったり、メール送信やファイル処理などのタスクを行ったりするRubyやRailsアプリケーションにとって、Sidekiqは重要なパーツとなります。バックグラウンド処理がなければ、長時間走るタスクがアプリのメインスレッドを塞ぎ、レスポンスタイムが遅くなり、ユーザー体験も悪くなってしまいます。

この記事では、Sidekiqを効果的に使用してバックグラウンドジョブを管理、処理する方法に焦点を当てていきます。

さあ、始めましょう!

Sidekiqの基本

根本的には、SidekiqはRuby用のフル機能のバックグラウンド処理フレームワークです。メールの送信、画像のリサイズ、CSVファイルの処理など、時間のかかるタスクを背後で行うことができます。

Sidekiqのアーキテクチャでは、「ワーカー」という概念とマルチスレッディングを重視しています。しかし、Sidekiq 6.3.0版からはSidekiq::WorkerモジュールはSidekiq::Jobに移行されました。「ワーカー」という用語が「プロセス? スレッド? 仕事のタイプ?」などと混同されがちなためです。

超高速なインメモリデータベースのRedisは、バックグラウンドジョブを保存するキューシステムとして、ここで重要な役割を果たします。

注記: SidekiqはRedisをデータ保管に頼っていますが、この記事ではRedisの設定や使用の詳細には触れません。

RailsでのSidekiqのインストールとセットアップ

始める前に、Rubyバージョン2.5以降とRedisサーバーバージョン4以降が必要です。

Sidekiq Rubyジェムをインストールする準備ができました。

アプリケーションのGemfileにSidekiqを追加してください:

gem 'sidekiq'

次に、プロジェクトディレクトリでインストールしてください:

bundle install

Sidekiqをインストールしたら、設定をする必要があります。Railsアプリケーションでは、ActiveJobアダプターとしてSidekiqを設定します。config/application.rbを開き、アプリケーションクラス定義の中に以下の行を追加してください:

config.active_job.queue_adapter = :sidekiq

さらに、Redisインスタンスを指すSidekiq初期化ファイルを作成することで、Sidekiqを設定できます。これはRailsアプリケーションが起動するときに実行される特別なスクリプトです。

config/initializerssidekiq.rbという名前のファイルを作成します。このファイル内で、さまざまなSidekiqの設定を指定できます。例えば:

Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://localhost:6379/1' }
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://localhost:6379/1' }
end

この設定では、SidekiqがローカルのRedisサーバーに接続するように指定されています。もちろん、本番環境では、このローカルURLを実際のRedisサーバーのものに置き換えることになります(これは環境変数を使う絶好の機会です)。

Sidekiqジョブの設定

基本的なSidekiqジョブの設定と初期化方法をここで紹介します:

require 'sidekiq'

class SomeNameForAJob
  include Sidekiq::Job

  def perform(name, count)
    # ここにバックグラウンドで実行するタスクの実装が入ります
  end
end

実際にジョブをキューに入れて実行するには、ジョブクラスでperform_asyncメソッドを呼び出します。例えばこんな感じです:

SomeNameForAJob.perform_async('some_name', 42)

この行は、利用可能になり次第実行されるデフォルトキューにジョブを追加します。'some_name'と42という引数はSomeNameForAJobの実行時にperformメソッドに渡されます。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/appsignal/an-introduction-to-sidekiq-for-ruby-on-rails-1dmh