207

RabbitMQ Java クライアントには、次の概念があります。

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

私は関係を理解し​​ようとしており、さらに重要なことに、それらの間の関連性を理解しようとしています.

  1. Channelこれが公開および消費する構造であり、開いている接続から作成されるという事実を除いて、私はまだ a が何であるかはよくわかりません。誰かが「チャンネル」が何を表しているのか説明してくれれば、いくつかのことを解決するのに役立つかもしれません.
  2. チャネルとキューの関係は? 同じチャネルを使用して複数のキューと通信できますか? それとも 1:1 でなければなりませんか?
  3. Queue と Consumer Pool の関係は? 複数のコンシューマを同じキューにサブスクライブできますか? 同じコンシューマーが複数のキューを消費できますか? それとも1対1の関係ですか?
4

4 に答える 4

228
  1. AConnectionはメッセージ ブローカーへの実際の TCP 接続を表し、aChannelはその内部の仮想接続 (AMQP 接続) です。このようにして、TCP 接続でブローカーを過負荷にすることなく、アプリケーション内で必要な数の (仮想) 接続を使用できます。

  2. 1本で何にでも使えChannelます。ただし、複数のスレッドがある場合は、Channelスレッドごとに異なる を使用することをお勧めします。

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

    チャネル インスタンスは、複数のスレッドで安全に使用できます。チャネルへの要求はシリアル化され、一度にチャネルでコマンドを実行できるスレッドは 1 つだけです。それでも、アプリケーションは、複数のスレッド間で同じチャネルを共有するのではなく、スレッドごとにチャネルを使用することを優先する必要があります。

    Channelと の間には直接的な関係はありませんQueue。AChannelは AMQP コマンドをブローカーに送信するために使用されます。これは、キューの作成などである可能性がありますが、これらの概念は結び付いていません。

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

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

于 2013-08-24T14:07:04.430 に答える
24

AMQP モデルのすべての側面を説明しているこの記事を見つけました。チャネルはそのうちの 1 つです。理解を深めるのにとても役に立ちました

https://www.rabbitmq.com/tutorials/amqp-concepts.html

一部のアプリケーションでは、AMQP ブローカーへの複数の接続が必要です。ただし、多くの TCP 接続を同時に開いたままにしておくことは望ましくありません。これを行うと、システム リソースが消費され、ファイアウォールの構成がより困難になります。AMQP 0-9-1 接続は、「単一の TCP 接続を共有する軽量接続」と考えることができるチャネルで多重化されます。

処理に複数のスレッド/プロセスを使用するアプリケーションの場合、スレッド/プロセスごとに新しいチャネルを開き、それらの間でチャネルを共有しないことは非常に一般的です。

特定のチャネルでの通信は、別のチャネルでの通信とは完全に分離されているため、すべての AMQP メソッドにはチャネル番号も含まれており、クライアントはそのメソッドがどのチャネル用であるか (つまり、どのイベント ハンドラを呼び出す必要があるかなど) を特定するために使用します。 .

于 2015-03-13T09:52:19.783 に答える