はじめに
本記事は、私自身が開発を行う中で、「結局、Sidekiq、Redis って何が嬉しんだっけ?」 という疑問に対して、それぞれの特徴や、どのような通信の順序でシステムに恩恵を与えてくれているのかについて備忘録も兼ねて整理したものとなります。
また、具体例があると分かりやすいので、ECサイトを元に記述しています。
具体例として利用するECサイトのインフラ構成図
Railsアプリケーションでよく見る構成図だと思います。
また、Renderを利用していますが、AWSでもheroku でもOKです。(もちろん、DBもpostgres以外でもOKです)
基本説明のおさらい
Sidekiq とは?
Sidekiqは、バックグラウンドジョブを非同期に処理するためのツールです。これにより、時間がかかるタスク(例、商品注文確定メールの送信)をWebリクエストの外で実行でき、アプリケーションのレスポンスを高速化できます。
主な特徴
- 非同期処理
- ジョブを即座に実行せず、バックグラウンドで処理
- 並行処理
- 複数のジョブを同時に処理できるため効率的
- 信頼性
- Redisを使ってジョブキューを管理し、ジョブが失われないようにする
- 管理画面でのモニタリング可能
- ジョブの状況を簡単に監視できることで、問題発生時にトラブル対応が容易になる
Redisとは?
Redis(Remote Dictionary Server)は、インメモリのデータ構造ストアであり、データベース、キャッシュ、およびメッセージブローカーとして利用されるオープンソースのソフトウェアです。高いパフォーマンスと多機能性を持ち、多くのアプリケーションで広く使用されています。
主な特徴
- 高速性
- データは全てメモリ上に格納されるため(インメモリデータベース)、高速な読み書きが可能
- 多様なデータ構造
- String, List, Set, Hash などなど様々なデータ構造に対応
- 永続性
- データをメモリ上に保持するだけでなく、ディスクに永続化することもできる
本題 ~ECサイトを元に考えてみた~
Sidekiq, Redis の概要がわかったところで、「ECサイトでのユーザーからの購入」などのシナリオに沿って整理していきたいと思いますー!
①ユーザーが商品を購入する
-
ユーザーが商品をカートに追加
- フロントエンド: ユーザーが商品詳細ページで「カートに追加」ボタンをクリック。
- バックエンド: このリクエストはRailsコントローラーに送信され、カート(通常はセッションまたはデータベース)に商品が追加される。
-
ユーザーが決済ページに移動
- フロントエンド: ユーザーがカート画面から「決済」ボタンをクリック。
- バックエンド: Railsコントローラーがカートの内容を確認し、決済ページを表示します。
-
ユーザーが注文を確定
- フロントエンド: ユーザーが支払い情報を入力し、「注文を確定」ボタンをクリック。
- バックエンド:
- 注文データの保存: RailsコントローラーがPostgreSQLに注文データを保存。
- バックグラウンドジョブのキューイング: 注文確定後、Sidekiqを使って以下のジョブを非同期で処理。
- 注文確認メールの送信
- 在庫の更新(更新後在庫数 = 更新前在庫数 - 購入数)
-
注文確認メールの送信(バックグラウンド)
- Sidekiqジョブ: OrderConfirmationJobがRedisのキューから取り出され、Sidekiqワーカーによって実行される。
- メール送信処理: UserMailer.order_confirmation(order).deliver_nowを実行。
- 状態更新: 処理結果をPostgreSQLに記録
-
在庫の更新(バックグラウンド)
- Sidekiqジョブ: InventoryUpdateJobがRedisのキューから取り出され、Sidekiqワーカーによって実行される
- 在庫減少処理
- 状態更新: 処理結果をPostgreSQLに記録
-
管理者への通知
- Sidekiqジョブ: 新しい注文があることを管理者に通知するジョブ(例:Slackなどに通知)も非同期で実行
②ユーザーがアカウント情報を更新する
- ユーザーがアカウント情報を入力
- フロントエンド: アカウント設定ページで情報を入力し、「保存」ボタンをクリック。
- バックエンド: 入力されたデータがRailsコントローラーに送信され、データベースに保存される。
- バックグラウンドでの追加処理
Sidekiqジョブ: ユーザー情報更新後、確認メールを送信するジョブがキューに追加される。
確認メールが送信され、ユーザーにアカウント情報の更新が通知される。
まとめ
SidekiqとRedisを活用することで、時間のかかる処理をバックグラウンドで実行し、ユーザー体験を向上させることができます。
最後までお読みいただきまして、ありがとうございました!
この記事が、どなたかのご参考になれば嬉しいです!