1

N個の交換をメモリやIOなどの同じキューにバインドした場合の影響をテストするアプリケーションを作成しようとしています。

テストはすべて「トピック」交換タイプを使用します。私が抱えている問題は、複数のエクスチェンジでテストしたときに、公開したすべてのメッセージを受信して​​いないことです。ただし、1つの交換を使用すると、すべてのメッセージを受信します。

なぜこれができるのか、何か考えはありますか?

ありがとう。

編集:

次の同じバインディングキーを使用して、2つの「トピック」交換にバインドされたキューがあります。

  • *。システムログ。#
  • #。システムエラー

次のように、各取引所に2つのメッセージを公開しています。

  1. 交換0

    • [本文]メッセージ0[ルーティングキー]#。system.error
    • [本文]メッセージ1[ルーティングキー]*。system.log。#
  2. 交換1

    • [本文]メッセージ0[ルーティングキー]#。system.error
    • [本文]メッセージ1[ルーティングキー]*。system.log。#

キューをリッスンしているコンシューマーが1人いますが、受信されるメッセージは次のとおりです。

  • ルーティングキー(* .system.log。#)を使用したメッセージ、交換0から、本文は「メッセージ1」
  • ルーティングキー(* .system.log。#)を含むメッセージ、交換1から、本文は「メッセージ1」

何か案は?

4

1 に答える 1

3

テストで何を証明しようとしているのかはよくわかりませんが、IOとメモリは、1つのキューにバインドした交換の数ではなく、キューの全体的なサイズに関連する関数になることを覚えておいてください。RabbitMQを使用したパフォーマンスとスケーラビリティのルーティングトポロジに関するこのブログ投稿は、非常に役立つ場合があります。

とにかく、問題はバインディングにあるようです。RabbitMQのWeb管理ポータルを使用するだけで、コードを1行も記述せずに問題を再現できます。

ここでトピック交換のセクションを見てくださいが、重要な部分は次のとおりです。

トピック交換に送信されるメッセージには、任意のrouting_keyを含めることはできません。ドットで区切られた単語のリストである必要があります。単語は何でもかまいませんが、通常、メッセージに関連するいくつかの機能を指定します。いくつかの有効なルーティングキーの例:「stock.usd.nyse」、「nyse.vmw」、「quick.orange.rabbit」。ルーティングキーには、255バイトの制限まで、いくつでもワードを含めることができます。

バインディングキーも同じ形式である必要があります。トピック交換の背後にあるロジックは、直接のロジックに似ています。特定のルーティングキーで送信されたメッセージは、一致するバインディングキーでバインドされているすべてのキューに配信されます。ただし、キーをバインドするための2つの重要な特殊なケースがあります。

* (star) can substitute for exactly one word.
# (hash) can substitute for zero or more words.

つまり、メッセージを公開するときは、system.errorsystem.logを実行する必要があります。

ただし、実際には、Exchangeバインディングに問題があると思います。RabbitMQ Web管理を使用してこれらのルーティングキーを使用して公開しようとすると、メッセージが実際にはキューにルーティングされていないことに気付くでしょう。これは、消費者がそれらを取得している理由を説明します...バインディングを行い、RabbitMQ Web管理を使用して、より大規模なテストを実行する前に、達成しようとしているルーティング動作を試してください。

于 2012-08-13T21:40:59.860 に答える