web-dev-qa-db-ja.com

パブリッシュするたびにチャンネル/接続を閉じる必要がありますか?

Node.jsでamqplibを使用していますが、コードのベストプラクティスについて明確ではありません。

基本的に、現在のコードはNodeサーバーが起動するときにamqp.connect()を呼び出し、プロデューサーとコンシューマーごとに異なるチャネルを使用します。それが理にかなっているのか、それともチャンネルを作成し、メッセージを公開するたびに公開して閉じる必要があるのか​​知りたいのですが、接続についてはどうでしょうか?サーバーの存続期間中は開いたままにしますか?
コンシューマー側-単一の接続と単一のチャネルを使用して、複数のキューでリッスンできますか?

明確化をありがとう

14
Noam Gal

一般に、メッセージごとに接続とチャネルを開いたり閉じたりすることは良い習慣ではありません。接続は長寿命であり、接続を開いたり閉じたりし続けるにはリソースが必要です。チャネルの場合、TCP接続を接続と共有するため、より軽量になりますが、メモリを消費するため、使用後は開いたままにしないでください。

スレッドごとにチャネルを、コンシューマごとにチャネルを作成することをお勧めします。しかし、公開には同じチャンネルを使用してもまったく問題ありません。ただし、操作によっては、プロトコルが特定の状況(キューの存在チェックなど)でチャネルを強制終了する可能性があるため、その準備をしてください。また、多くのクライアント実装の最大チャネル数には、ソフト(構成可能)およびハード(通常65535)の制限があります。

要約すると、ユースケースに応じて、1つからいくつかの接続を使用し、必要なときにチャネルを開き、意味があるときにチャネルを共有します。

Rabbitmq documentation は、接続とチャネルの性質を説明しています(ドキュメントの終わり)。そして、 this 質問で受け入れられた回答には、主題に関する良い情報があります。

23
Mikko