Redisメッセージキューによる瞬殺実装
秒殺機能を実現するため、Redisのメッセージキューを使用して非同期処理を実行できます。以下は、基本的な実装方法です。
- 準備作業:商品ストックのキーバリュー「stock:商品ID」を作成し、初期値に商品の在庫数を入れる。秒殺注文コレクションを作成し、秒殺が成功した注文を保存する。
- ユーザーが秒殺リクエストを送信した際、まず商品の在庫があるかどうかを確認します。もし在庫が不足している場合は秒殺失敗メッセージを返却し、在庫が十分ある場合はユーザーの秒殺リクエスト情報をメッセージとしてまとめて Redis のメッセージキューに追加します。
- メッセージを高速処理:1 つ以上のコンシューマー スレッドを起動し、Redis のメッセージ キューからメッセージを取得して処理します。コンシューマー スレッドは、メッセージを順序に処理します。各メッセージには、ユーザー ID と商品 ID が含まれています。メッセージを処理する際には、まず商品在庫が十分にあるかどうかをチェックします。在庫が不足している場合、そのユーザーの秒殺リクエストには秒殺失敗のフラグが付けられます。在庫が十分にある場合は、次の操作を実行します。
- 商品の在庫数が1減るDECR(デクリメント)コマンドにより商品の在庫数を減らす
- 在庫数が1減算した結果が0より小さければ、その商品は完売したことになるので、そのユーザーの購入リクエストを完売として処理する。
- 在庫から -1 した結果が0 以上の場合、指定されたユーザーの秒殺リクエストを成功としてマークし、成功した秒殺の注文情報を秒殺注文コレクションに保存する。
- 秒殺の結果を確認する方法は、ユーザーによる秒殺リクエスト後に、フロントエンドポーリングや長接続などの手段で秒殺結果を継続的に取得する方法があります。 フロントエンドは、秒殺注文の集合を照会することで自分の秒殺リクエストが成功したかどうかを判断できます。
秒殺リクエストをRedisのキューに投入することで非同期処理を実現し、システムの並行処理能力と応答速度が向上。商品の在庫の原子操作と秒殺注文の保存により、秒殺の正確性と一貫性が保証されている。