RabbitMQ 経由で送信したい 2 種類のメッセージがあります。したがって、これを行う方法は2つあります。
routing_key
キュー名に対応するデフォルトの空の名前の交換にメッセージを送信しました- キューバインディングでコンシューマーのパラメーターに対応する
direct
取引所のパラメーターを使用するrouting_key
routing_key
では、どのオプションが望ましいのでしょうか?またその理由は?
RabbitMQ 経由で送信したい 2 種類のメッセージがあります。したがって、これを行う方法は2つあります。
routing_key
キュー名に対応するデフォルトの空の名前の交換にメッセージを送信しましたdirect
取引所のパラメーターを使用するrouting_key
routing_key
では、どのオプションが望ましいのでしょうか?またその理由は?
デフォルトの交換は直接交換です。RabbitMQ はデフォルトでデフォルト交換を作成しますが、名前には空の文字列を使用します。RabbitMQ AMQP の概念ページを見ると、[デフォルトの交換] の下に次のように表示されます。
デフォルトの交換は、ブローカーによって事前に宣言された名前 (空の文字列) のない直接交換です。
これは、次のコマンドを実行rabbitmqctl list_exchanges
しても確認できます。
direct
Foo direct < Same thing as the above
amq.direct direct
amq.fanout fanout
...and so on
私の知る限り、一方を他方よりも使用するメリットはありません。ルーティング キーに基づいてルーティングするだけでよい場合は、デフォルトの交換を使用します。
「info」、「warn」、および「error」のルーティングキーにログをブロードキャストする交換に直接バインドするとします。デフォルトの交換を使用して、すべてのログを受信するには、これらの名前で 3 つの異なるキューを作成する必要があります。また、受信するログ レベルを調整するには、キュー宣言を変更する必要があります。名前付き交換を使用することで、キューのバインディングを変更するだけで、通常どおり処理を続行できます。
つまり、1 つの追加レベルの抽象化を提供します。
私が見たように、デフォルトの直接交換は、キューの名前を暗黙的に使用してキュー (コンシューマーによって使用される) をエクスチェンジ (プロデューサーによって使用される) にバインドすることにより、コンシューマーとプロデューサーがお互いを知らない可能性を与えます。
特定のケースでは、デフォルトの直接交換を使用します。消費者と生産者はお互いを知りません。私の場合、各消費者には適切なキューがあります。プロデューサからは、コンシューマに依存するため、どのキューが宣言されて使用されるかを事前に知ることはできません。そのため、カスタムの直接交換とプロデューサー側のキューの間のバインディングを定義することは不可能です。カスタム (ユーザー定義) の直接交換で解決する 1 つの方法は、消費者側でバインディング キーを定義することです。ただし、プロデューサーが使用する交換名を知る必要があるため、コンシューマー側からプロデューサーについて知る必要があります。
したがって、デフォルトの直接交換でキューをその名前で自動的にバインドすると、私の場合、コンシューマー側でのみキューを宣言し、キューの名前を知っているだけでプロデューサーからキューにメッセージを送信できます。
もちろん、カスタム直接交換のバインディングキーを知る必要があるため、プロデューサーを呼び出すときに実行時にキューの名前を知ることを意味します(私の場合、キューの名前はプロデューサーを使用するアプリケーションによって与えられます) )。ただし、ブローカーを構成するとき、プロデューサーとコンシューマーはお互いを知る必要はありません。