オンラインストアを想像してみてください。顧客が注文するたびに、以下のことを行う必要があります。
- 支払いを処理する。
- 在庫を更新する。
- 確認メールを送信する。
特にピーク時にこれらすべてを即座に行うと、顧客の体験が遅くなる可能性があります。
この場合、多数のアプリケーションイベントがあり、それらをすべて一度に処理することはできません。
もちろん、サーバーをスケールアップして、これらの大量のアプリケーションイベントを処理することもできますが、一度にすべてを処理する必要がない場合は、これらのイベントをキューに入れて後で処理する方が良いでしょう。
メッセージキューの基本アーキテクチャ
メッセージキューは、非同期通信をサポートするメモリに格納される永続的なコンポーネントです。バッファとして機能し、非同期リクエストを分散します。
メッセージキューの基本的なアーキテクチャは単純です。プロデューサーまたはパブリッシャーと呼ばれる入力サービスは、メッセージを作成してメッセージキューに公開します。コンシューマーまたはサブスクライバーと呼ばれる他のサービスは、キューに接続し、メッセージによって定義されたアクションを実行します。
実際のシナリオでは、キューに書き込む多くのアプリとキューから読み取る多くのサーバーが存在する可能性があります。
例に戻りましょう
したがって、この場合、各タスクを即座に処理する代わりに、キューの最後に追加し、このキューからサーバーに送信できます。
- 注文が行われた:注文の詳細がメッセージに入れられます。
- メッセージが送信された:メッセージがキューに追加されます。
- ワーカーが処理する:別のプロセス(ワーカー)がキューの先頭からメッセージを取り出し、タスクを処理します。
また、サーバーはメッセージを受信して処理したことを確認し、キューはそれを削除して2回目に送信されないようにします。
メッセージキューを使用する利点
主な利点は、これらのイベントを分離することであり、このメッセージキューにより、これらのイベントを非同期的に処理できます。処理できるようになるまで、それらをキューに入れることができます。
メッセージキューを使用すると、コンシューマーが処理できない場合でも、プロデューサーはメッセージをキューに投稿できます。
また、プロデューサーが利用できない場合でも、コンシューマーはキューからメッセージを読み取ることができます。
もう1つの大きな利点は、耐久性があることです。キューがクラッシュしても、データはRAMではなくディスクに保存されているため、失われることはありません。
ワーカーがメッセージの処理中にクラッシュしても問題ありません。メッセージはまだキューにあり、別のワーカーによって取得されます。
メッセージキューはスケーラビリティも提供します。注文が殺到した場合、キューは単に長くなります。Webサイトに影響を与えずに、ワーカーを追加して追加の負荷を処理できます。
さまざまなキュータイプ
メッセージキューには複数のタイプがあります。最も一般的なものは次のとおりです。
- FIFO(先入れ先出し):通常の行列と同じように、メッセージは到着順に処理されます。これは、支払い処理などにとって重要です。
- 優先度キュー:一部のメッセージは他のメッセージよりも重要な場合があります。これらを優先して、より早く処理されるようにすることができます。
FIFOキューと優先度キューの一般的なユースケース
FIFOキューのユースケース
-
注文処理システム
- 理由:注文は受信順に処理する必要があるため、FIFOキューが最適です。これにより、公平性が保たれ、在庫の整合性が維持されます。
-
チケット予約システム
- 理由:「先着順」の原則を維持するために、FIFOキューが使用されます。これにより、システムの公平性と透明性が確保されます。
-
ログ処理
- 理由:イベントの時系列を正確に維持するために、ログエントリはFIFOキューで処理されます。これにより、デバッグや監査が容易になります。
優先度キューのユースケース
-
緊急対応システム
- 理由:緊急度の高い要求(例:救急車の派遣)を優先的に処理する必要があるため、優先度キューが適しています。
-
カスタマーサポートチケットシステム
- 理由:重要な顧客や緊急の問題を優先的に処理するために、優先度キューが使用されます。これにより、顧客満足度が向上します。
-
オペレーティングシステムのタスクスケジューリング
- 理由:システムの効率を最大化するために、重要なタスクを優先的に実行する必要があります。優先度キューはこれを可能にします。
プッシュ対プル
一部のキューはワーカーがメッセージを要求するのを待ち(プルベースのキュー)、他のキューはメッセージをワーカーに積極的に送信します(プッシュベースのキュー)。
例
メッセージキューのいくつかの一般的な例を次に示します。
- RabbitMQ:多くのユースケースに適した汎用的なキューです。
- Kafka:高スループットとリアルタイムのデータストリーミング用に構築されています。ロギングやイベント駆動型アーキテクチャなどに最適です。
- Amazon SQS(Simple Queue Service):AWSが提供する完全に管理されたクラウドベースのキューサービスです。遅延キューとデッドレターキューなどの機能を備えた、スケーラブルで信頼性の高いサービスです。
ボーナス:メッセージキューの具体的なユースケース
-
マイクロサービスアーキテクチャ
- 説明:異なるサービス間の非同期通信を可能にし、システムの柔軟性と拡張性を向上させます。
-
バッチ処理
- 説明:大量のデータを効率的に処理するために使用されます。例えば、夜間のデータ分析や報告書生成などに適しています。
-
イベント駆動型アーキテクチャ
- 説明:システム内のさまざまなコンポーネント間でイベントを伝播させるために使用されます。これにより、システムの反応性と柔軟性が向上します。
-
負荷分散
- 説明:タスクを複数のワーカーに分散させることで、システムのパフォーマンスと可用性を向上させます。
-
クロスプラットフォーム統合
- 説明:異なる技術スタックやプラットフォーム間でデータを交換するための中間層として機能します。
-
IoTデータ処理
- 説明:多数のIoTデバイスからのデータストリームを効率的に処理し、分析するために使用されます。
これらのユースケースは、メッセージキューがさまざまな状況で重要な役割を果たすことを示しています。適切なキュータイプを選択することで、システムの効率性、信頼性、スケーラビリティを大幅に向上させることができます。
この記事は、Message Queues in System Designから翻訳されました。