8

パブリッシュ/サブスクライブ RabbitMQ Java チュートリアルを使用してファンアウト交換を作成することができ、接続されているすべてのコンシューマーがメッセージのコピーを受信します。動的/プログラム的に交換とバインディングを宣言する代わりに、消費者を接続する前に交換とバインディングを作成したいと思います。これは、RabbitMQ 管理コンソールを使用して行いました。しかし、何らかの理由で、すべてのコンシューマがメッセージのコピーを受信するのではなく、ラウンド ロビン方式でメッセージを受信して​​います。私は何が欠けていますか?以下にいくつかのコード スニペットを示します。

出版社:

channel.basicPublish("public", "", null, rowId.getBytes("UTF-8"));

消費者:

QueueingConsumer consumer = new QueueingConsumer(channel);
            channel.basicConsume("myqueue", false, consumer);

...そして、RabbitMQ 管理コンソールで、タイプ「ファンアウト」のエクスチェンジ「パブリック」を作成し、そのエクスチェンジから「myqueue」へのバインディングを設定しました。

助けていただければ幸いです!

4

1 に答える 1

25

すべてのコンシューマーが同じキューをサブスクライブしているようです。複数のコンシューマーが同じキューにサブスクライブしている場合、RabbitMQ のデフォルトの動作は、サブスクライブしているすべてのコンシューマー間でメッセージをラウンドロビンすることです。RabbitMQ チュートリアル #2: ワーク キューの「ラウンド ロビン ディスパッチ」を参照してください。

ファンアウト交換は、それにバインドされた各キューが、各コンシューマではなく、メッセージのコピーを確実に取得するためのものです。各コンシューマにメッセージのコピーを取得させたい場合は、通常、各コンシューマに独自のキューを作成してから、交換にバインドさせます。プログラムによるキューの作成/バインドを回避しようとしている理由はわかりませんが、サブスクライバーの数を事前に知っていて、それぞれのキューを作成すると、同じ効果が得られます。

于 2013-03-11T19:10:03.187 に答える