1. ホーム

[解決済み】RabbitMQとチャネルとコネクションの関係

2022-04-13 12:14:51

質問

その RabbitMQのJavaクライアント は以下の概念を持つ。

  • Connection - RabbitMQサーバインスタンスへの接続
  • Channel - ???
  • Consumer thread pool - RabbitMQサーバーのキューからメッセージを消費するスレッドのプールです。
  • キュー - メッセージを FIFO 順序で保持する構造体

関係性を理解したい そしてもっと重要なのは は、その アソシエーション の間にある。

  1. がどういうものなのか、まだよく分かっていないんです。 Channel は、これがパブリッシュとコンシュームのための構造体であり、オープンコネクションから作成されるという事実以外には、ありません。もし誰かが、"Channel" が何を表しているのか説明してくれれば、いくつかのことをクリアにするのに役立つかもしれません。
  2. ChannelとQueueの関係はどうなっていますか?同じチャンネルで複数のキューに通信できるのでしょうか、それとも1対1でなければならないのでしょうか?
  3. キューとコンシューマプールの関係はどうなっていますか?複数のコンシューマーが同じキューに登録できますか?複数のQueueを同じConsumerに消費させることはできますか?それとも1:1の関係ですか?

解決方法は?

  1. A Connection はメッセージブローカーへの実際の TCP 接続を表します。 Channel は、その内部の仮想接続(AMQP接続)です。こうすることで、ブローカーに TCP 接続の負荷をかけずに、アプリケーション内部で必要なだけの (仮想) 接続を使用することができます。

  2. を1つ使用することができます。 Channel を全てに使用します。しかし、複数のスレッドがある場合は、別の Channel を各スレッドで使用します。

    JavaクライアントAPIガイドのチャンネルスレッドセーフティ :

    チャンネルインスタンスは、複数のスレッドで使用しても安全です。リクエストは チャンネルはシリアライズされ、1つのスレッドのみが コマンドを一度に実行することができます。それでも、アプリケーションは 同じチャネルを複数のスレッドで共有するのではなく、スレッドごとにチャネルを使用することで 複数のスレッドで

    とは直接の関係はありません。 ChannelQueue . A Channel は、ブローカーに AMQP コマンドを送信するために使用します。これはキューの作成などにもなりますが、これらの概念は関連付けられていません。

  3. Consumer は、コンシューマースレッドプールから割り当てられた独自のスレッドで実行されます。複数のコンシューマが同じ Queue に登録されている場合、ブローカはラウンドロビン方式でそれらのコンシューマに等しくメッセージを分配します。以下を参照してください。 チュートリアル2:「ワークキュー」。 .

    また、同じ Consumer を複数のQueueに設定することができます。 コンシューマはコールバックとして理解することができます。これは、Consumer がバインドされている Queue にメッセージが到着するたびに呼び出されます。Java Client の場合、各コンシューマーはメソッド handleDelivery(...) があり、これがコールバックメソッドを表します。通常行うのは DefaultConsumer をオーバーライドし handleDelivery(...) . 注意:同じ Consumer インスタンスを複数のキューにアタッチした場合、このメソッドは異なるスレッドから呼び出されることになります。そのため、必要に応じて同期をとるようにしてください。