4

多分私はここで間違った質問をしています。

私がやろうとしているのは、複数のプロデューサーが動的カテゴリのデータを名前付き交換にプッシュすることです。複数のコンシューマーが、これらの動的に名前が付けられたキューからこのデータを取得し、それらに基づいて行動する必要があります。

問題は、私が目にするすべての消費の例では、コンシューマー/サブスクリプションに特定のキュー名が必要であり、私のコンシューマーはキューの名前を知らないか、これを知る必要がないことです。

なぜ私はこれをしているのですか?2 つの理由:

  1. これらの動的カテゴリを一度に N 個持つことができます。キューがこれらのカテゴリを均等に処理することを望みます。現在、これらのカテゴリをすべて受け入れ、FIFO で提供する 1 つのキュー (msmq) があります (つまり、一部のカテゴリはしばらくの間枯渇します)。

  2. fifo ではなく、すべてのカテゴリを均等に提供できるので、興味深い QoS を思いつくことができます (デフォルトでは、Rabbit がメッセージをラウンドロビンで提供することを理解しています)。

それで、私の質問に戻ります (有効な場合): キューからメッセージを消費することは可能ですか?

4

2 に答える 2

6

動的サブスクライバーを持つことがオプションである場合、2 つの可能な解決策を提案したいと思います。

解決策 1:

  • トピック交換を使用します。
  • 交換にメッセージを発行するときは、必須配信フラグを使用します。
  • メッセージが拒否された場合: キューを作成し、特定のルーティング キーにバインドして、キューでサブスクライバーを開始し、拒否されたメッセージを再発行します。
  • 自動削除キューを使用して、サブスクライバーが停止したときにキューが消え、自動作成のプロセス全体を再開できるようにします。

解決策 2:

  • トピック交換を使用します。
  • メッセージを取引所に公開するときは、即時配信フラグを使用します。
  • メッセージが拒否された場合: キューを作成し、特定のルーティング キーにバインドして、キューでサブスクライバーを開始し、拒否されたメッセージを再発行します。
  • 永続キューを使用します。キューの作成はべき等であるため、再作成の手順を実行しても問題ありません。ここで重要なのは、ライブ サブスクライバがキューでリッスンしていることを確認することです。

動的サブスクライバーがオプションでない場合、ここに私が提案するものがあります。サブスクライバーがn人に制限されていると仮定すると、次のようになります。

  • n 個のルーティング キーで動的カテゴリをハッシュする戦略を定義し、
  • 直接交換を使用し、
  • n 個のルーティング キーに対してn 個のキューをバインドします。
  • キューごとに 1 つのサブスクライバーを用意します。
于 2011-12-02T17:39:48.147 に答える
0

AMQP を使用すると、メッセージを Exchange に発行し、キューからメッセージを消費します。他のメッセージング テクノロジでの「キュー」の意味について心配する必要はありません。

あなたのシナリオは、トピック交換で簡単に処理できるように思えます。cat.silly、cat.older、cat.interesting などのルーティング キーを使用してメッセージを発行します。次に、バインディング キー cat.* を使用して、コンシューマーにそれぞれキューを宣言させます。

このように、バインディング キーのワイルドカードにより、任意のプレフィックスを使用してエクスチェンジに公開されたすべてのメッセージがキューにコピーされます。コンシューマーが実際にラウンド ロビン共有を行っている場合、つまりメッセージを複数のキューにコピーしない場合は、すべてのコンシューマーが同じキュー名を使用するようにします。すべてのコンシューマーが同じキュー名を使用している場合、それをコードにコンパイルすることができ、名前が何であるかを気にする必要はありません。ただし、メッセージ フローをデバッグする場合は、同じバインド キー cat.* を持つ catdebug という名前のキューにサブスクライブするコンシューマーを作成するだけです。

ただし、各コンシューマーが特殊化されており、処理するメッセージを選択したい場合は、各コンシューマーに一意のキュー名を使用させます。そうすれば、各消費者はすべてのメッセージのコピーを見ることができます。

トピック交換は、直接交換とファンアウト交換のセマンティクスを簡単にエミュレートできるため、最初に試すのに最適なソリューションです。

于 2012-01-17T07:38:07.717 に答える