0

私はamqp全体に取り組んでおり、次のシナリオで使用する交換タイプのタイプについて質問があります。

1)メッセージを受信したときに各ワーカーが何かを実行するワーカープールを作成する必要があります。今、私はさまざまな種類のタスクにさまざまな労働者を結び付けたいと思っています。これは、トピック形式で各メッセージのルーティングキーを使用して指定できます。消費者側では、昆布を少しいじってみると、同じキュー名を指定してもルーティングキーが異なると、メッセージを「フィルタリング」できないことに気付きます。たとえば、1つのコンシューマーに「#」があり、別のコンシューマーに「foo。#」がある場合、両方とも同じキュー名を使用します。後者のコンシューマーは、前のコンシューマーのキューでラウンドロビンを実行します。これは予想されますか?同じマシンで両方のコンシューマーを実行しています。

2)そのため、私は各コ​​ンシューマーに固有のキュー名を作成しますが、今回は、各コンシューマーはルーティングキーを使用して要求したものだけを取得します。ただし、これらは別個のキューであるため、複数のコンシューマーでタスクを取得する場合があります。たとえば、コンシューマー1にキー「#」があり、コンシューマー2に「foo。#」がある場合。コンシューマー2がメッセージを受信(および確認)すると、コンシューマー1も同じメッセージを受信します。これは私が望むものではありません。私は1人の消費者だけがメッセージだけを受け取ることを望みます。「タスクマネージャー」を作成せずにこれを実現する方法はありますか?

乾杯、

4

1 に答える 1

0

ほとんどの人にとって、AMQPがどのように機能するかを完全に理解するまで、すべてにトピック交換を使用するのが最善です。キューに適切なバインディングキーを選択するだけで、ファンアウトと直接的な動作を得ることができます。たとえば、バインディングキーに「#」を使用すると、そのキューは直接交換に接続されているかのように動作します。また、2つ以上のキューを同じルーティングキーにバインドすると、それらのキューはファンアウト交換であるかのように機能します。

ラウンドロビン動作が予想されます。両方のタスクは、まったく同じキューにサブスクライブされます。バインディングキーが異なるという事実は、すべてを混乱させるだけです。おそらく最後にバインドする人は誰でも、すべてのキューユーザーにバインドキーを設定します。そうしないのが最善です。私は、複数のキューにまったく同じワーカーコードのインスタンスが4〜15個あり、同じキューからメッセージを取得して、Webサービスからデータを収集するシステムを構築しています。最終的にはパフォーマンスに必要ではありませんでしたが、ワーカーを別のCPUで実行することもできました。

バインディングキーでワイルドカードを使用している理由がわかりません。AからHという名前の8つのコンシューマーがあり、それぞれが異なるジョブを実行する場合は、ルーティングキーwork.Aからwork.Hを使用してメッセージを公開し、同じバインディングキーwork.Aからwork.Hを使用してみませんか。そうすれば、ワーカーBのインスタンスが複数ある場合、それらはすべてwork.Bにバインドされ、メッセージは2回配信されません。

また、メッセージを処理した後で確認しないと、最終的にはキューに戻り、再度配信されます。うまくいけば、メッセージを正常に処理した後、あなたは確認しているでしょう。タスクマネージャーは必要ありません。すべてのAMQPノブをよりよく理解するだけです。

于 2011-08-20T06:43:06.087 に答える