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/initializers
にsidekiq.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