背景
個人開発で、ある機能を実装していた際に、一度に約40通のメールを送信する必要がありました。通常のコントローラーでメール送信を処理すると、すべてのメール送信が完了するまでリクエストが処理され続けるため、時間がかかりすぎるという問題に直面しました。このため、ユーザーへのレスポンスを早くするためにも、メール送信をバックグラウンドで行う必要がありました。
Redisとは
Redis は、高速で軽量なデータベースとして動作するインメモリ型のデータ構造ストアです。ジョブキューの管理にも利用され、リアルタイムアプリケーションやキャッシュとして広く使われています。Sidekiq のようなバックグラウンドジョブ処理システムのキュー管理にも使用され、ジョブの順序管理やステータスを効率的に処理します。
Sidekiqとは
Sidekiq は、Ruby on Rails アプリケーションのバックグラウンドジョブを処理するためのツールです。ジョブを並列処理できるため、メール送信やファイル処理などの重いタスクを別のスレッドで非同期に実行し、パフォーマンスを向上させることができます。バックエンドとしてRedisを使用し、スムーズにジョブ管理が行えます。
設定手順
ステップ1
Gemfileに sidekiq を追加し、インストール
gem 'sidekiq'
インストール後、bundle install を実行します。
ステップ2
ActiveJobの設定を開発環境に追加 config/environments/development.rb に以下の設定を追加します。
config.active_job.queue_adapter = :sidekiq
ステップ3
メール送信のバックグラウンド設定 メール送信箇所で deliver_now を deliver_later に変更します。
User.enabled.find_each do |user|
EventMailer.participation(user, @event).deliver_later
end
ステップ4
Redisサーバーの起動 Sidekiq は Redis を利用するため、以下のコマンドで Redis サーバーを起動します。
redis-server
ステップ5
Redis CLIで接続確認 redis-cli コマンドを使用して、Redisが正しく起動しているか確認できます。
redis-cli
ステップ6
Sidekiqの起動 Sidekiq を起動するため、以下のコマンドを実行します。
bundle exec sidekiq
バックグラウンドジョブが正常に実行されるか確認 Sidekiq のログやWebインターフェース(localhost:3000/sidekiq)でジョブの処理状況を確認できます。
まとめ
バックグラウンドでメールを送信することで、処理時間を大幅に短縮し、ユーザーへのレスポンスが速くなります。ActiveJob と Sidekiq の設定は簡単で、メール送信の負荷が大きいアプリケーションでもスムーズに動作します。