接続は、アプリケーションと ApsaraMQ for RabbitMQ の間の物理 TCP リンクです。チャネルは、その TCP リンク上で多重化される軽量な仮想接続です。キューの宣言、メッセージのパブリッシュ、メッセージのコンシュームなど、すべての Advanced Message Queuing Protocol (AMQP) 操作は、接続上で直接実行されるのではなく、チャネル上で実行されます。
接続
接続は、IP アドレス解決、TCP ハンドシェイク、AMQP プロトコルネゴシエーション、認証、ルーティングなどの基盤となるネットワークタスクを処理します。接続の確立には、おおよそ 15 個の TCP パケットが必要です。このオーバーヘッドのため、接続の作成にはコストがかかり、長時間維持する必要があります。
短時間で終了する接続が大量にあると、ネットワークとサーバーのリソースを大量に消費します。高いレートで接続を頻繁に作成すると SYN フラッド防御がトリガーされ、ApsaraMQ for RabbitMQ インスタンスが応答しなくなる可能性があります。

チャネル
チャネルは、物理 TCP 接続上に確立される仮想接続です。各接続は複数のチャネルを持つことができます。接続が閉じられると、その接続上のすべてのチャネルも閉じられます。
多数のアプリケーションを ApsaraMQ for RabbitMQ に接続してメッセージを送受信するには、適切な数の接続を確立し、各接続内で複数のチャネルを再利用してください。この方法は、操作のたびに新しい TCP 接続を開く場合と比べて、システムリソースの使用量を削減します。

注意事項
永続的な接続の使用
アプリケーションの起動時に接続を開き、アプリケーションのライフサイクル全体にわたって維持してください。パブリッシュまたはコンシュームの操作ごとに接続を開閉しないでください。
ワークロードでチャネルの作成が頻繁に必要な場合は、安定した接続セットを再利用し、その中で複数のチャネルを作成してください。接続およびチャネルのオープンレートの制限については、制限事項をご参照ください。
プロデューサーとコンシューマーの接続の分離
メッセージのプロデュース用に少なくとも 1 つの接続を使用し、コンシューム用には別の接続を使用してください。ApsaraMQ for RabbitMQ は、インスタンスが処理できる速度を超えてパブリッシュする接続に対してフロー制御 (バックプレッシャー) を適用します。プロデューサーとコンシューマーが接続を共有すると、パブリッシュ側のフロー制御によってコンシューマー確認応答が遅延し、コンシュームのスループットが低下する可能性があります。
スレッドごとに 1 つのチャネルの使用
複数のスレッドで接続を共有できます。ただし、ほとんどのクライアントライブラリではチャネルはスレッドセーフではありません。スレッド間でチャネルを共有するのではなく、各スレッドに専用のチャネルを割り当ててください。
// アンチパターン:スレッド間でチャネルを共有する
Channel shared = connection.createChannel(); // スレッドセーフではありません
// 推奨:スレッドごとに 1 つのチャネル
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 4; i++) {
executor.submit(() -> {
Channel ch = connection.createChannel();
// このスレッドのパブリッシュ/コンシューム操作に ch を使用します
});
}複数のプロセスで接続を共有する場合は、接続を頻繁に開閉しないでください。そうしないと、ChannelNotFound エラーが発生する可能性があります。
消費の偏りの防止
少数の接続だけで大量のメッセージを処理すると、コンシューマー間で消費が不均等になる場合があります。これを防ぐには、次の対策を実施してください:
コンシューマーあたりの接続数を増やすか、コンシューマーを追加してください。
各コンシューマーが同じ数の接続を確立するようにしてください。
目安として、コンシューマー接続の合計を少なくとも 30 に維持してください。
チャネルの頻繁な作成とクローズの回避
単一の接続内でチャネルを頻繁に作成およびクローズしないでください。channelOpen と channelClose の TPS 合計を 1,000 未満に維持してください。このしきい値を超えると、ブローカーに過度な負荷がかかります。
クイックリファレンス
| ガイドライン | 詳細 |
|---|---|
| 接続のライフサイクル | 永続的。起動時に開き、シャットダウン時に閉じます。 |
| チャネルのライフサイクル | スレッドごと、または操作バッチごとに開きます。不要になったら閉じます。 |
| プロデューサーとコンシューマー | フロー制御を分離するために接続を分けます。 |
| スレッドセーフティ | スレッド間で接続を共有できます。チャネルは共有しないでください。 |
| コンシューマー接続の最小数 | 消費の偏りを回避するために、合計 30 以上。 |
| レート制限 | 制限事項をご参照ください。 |