核心コンセプト#
RabbitMQ は、生産者と消費者のモデル全体を担当し、メッセージの受信、保存、転送を主に行います。
RabbitMQ の全体的なアーキテクチャ
- プロデューサー(生産者)とコンシューマー(消費者)
- メッセージの構成:
- メッセージヘッダ(ラベル):
- ルーティングキー
- 優先度
- 配信モード(永続性の保存)
- メッセージ本体(ペイロード)
- メッセージヘッダ(ラベル):
- エクスチェンジ(交換機):プロデューサーはメッセージをエクスチェンジに送信し、それが1 つ以上のキューにルーティングされる。ルーティングできない場合は、プロデューサーに返されるか、直接破棄されます。
-
プロセス:メッセージを公開 + ルーティングキー → エクスチェンジ → バインディングキー → キュー > コンシューム
-
一般的なタイプ:
-
direct(デフォルト):メッセージをBindingKey と RoutingKey が完全に一致するキューにルーティングします。優先度のあるタスクの処理に使用されます
-
fanout:メッセージをバインドされたすべてのキューにルーティングします。メッセージのブロードキャストに使用されます。
-
topic:メッセージを **BindingKey と RoutingKey が一致する(完全一致またはパターン一致)** キューにルーティングします。
- BindingKey と RoutingKey はドット(.)で区切られた文字列です。
- BindingKey には、2 つのパターンマッチング文字列「*」(1 つの単語に一致)と「#」(0 個以上の単語に一致)が存在します。
-
headers(非推奨):メッセージの内容のヘッダー属性に基づいて一致させるため、パフォーマンスが低下し、実用的ではなく、ほとんど使用されません。
-
-
- キュー(メッセージキュー):メッセージのコンテナであり、1 つ以上のキューにメッセージを投入できます。
- コンシューム:1 つまたは複数のコンシューマー(ラウンドロビンで平均的に分散)が同じキューを購読できます。
- バインディング(結合):BindingKey を使用してキューをエクスチェンジにバインドします。
- ブローカー(メッセージブローカーのサービスノード):RabbitMQ ブローカーは、RabbitMQ サービスノードまたは RabbitMQ サービスインスタンスとして単純に見ることができます。
- デッドレターエクスチェンジ(死信交換機):メッセージがキュー内でデッドメッセージになった場合、デッドレターエクスチェンジに送信されます。
- デッドレターの原因:
- メッセージが拒否され(Basic.Reject/ Basic.Nack)され、再キューイングが false に設定されている場合
- メッセージの TTL が切れた場合
- キューが一杯の場合
- デッドレターの原因:
- ディレイキュー:特定の時間後にメッセージが消費されます。
- 実現方法:
- RabbitMQ のデッドレターエクスチェンジ(Dead Letter Exchange)とメッセージの生存時間(TTL)を使用する
- RabbitMQ 3.5.7 + で開発されたプラグイン(rabbitmq-delayed-message-exchange)を使用する
- 実現方法:
- 優先度キュー:RabbitMQ 3.5.0 + では、
x-max-priority
パラメータを使用して実現されます。消費速度が生産速度を上回り、ブローカーに積み重なりがない場合、このパラメータは意味を持ちません。 - メッセージの転送:TCP 接続上に構築されたチャネル(Channel)に基づいて行われ、数に制限はありません。各チャネルには RabbitMQ で一意の ID があり、スレッドごとに 1 つの ID が対応します。
- メッセージの信頼性:
- プロデューサーから RabbitMQ へ:トランザクションメカニズムまたは確認メカニズム。注意:トランザクションメカニズムと確認メカニズムは相互排他的であり、両方を同時に使用することはできません。これにより、RabbitMQ がエラーを報告します。
- RabbitMQ 自体:永続化、通常のクラスタリング、ミラーリングクラスタリング
- RabbitMQ からコンシューマーへ:basicAck メカニズム、デッドレターキュー、メッセージ補償メカニズム
- メッセージの順序:
- 複数のキューに分割し、各キューに 1 つのコンシューマーを割り当てます(スループットが低下します)。
- コンシューマーはメッセージを消費せず、メッセージ内のキー値に基づいてハッシュ化し(例:ID、同じ ID の複数のメッセージ)、ハッシュ値に基づいて異なるメモリキューにグループ化し、最後に各グループを異なるワーカー、つまりサブスレッドに処理させます(コンシューマー内でマルチスレッドで消費する方法)。
- 高可用性:
- 通常のクラスタリング:データはメインノードにあり、サブノードはメインノードのキューメタデータのみを同期し、メッセージは同期しません。
- ミラーリングクラスタリング:メインノードとサブノードのデータは完全に同期します。