RabbitMQの交換、キュー、およびバインディング
1. 概要
RabbitMQがどのように機能するかをよりよく理解するには、そのコアコンポーネントに飛び込む必要があります。
この記事では、交換、キュー、バインディング、およびJavaアプリケーション内でそれらをプログラムで宣言する方法について説明します。
2. 設定
いつものように、RabbitMQサーバーにはJavaクライアントと公式クライアントを使用します。
まず、RabbitMQクライアントのMaven依存関係を追加しましょう。
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>
次に、RabbitMQサーバーへの接続を宣言し、通信チャネルを開きます。
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
また、セットアップのより詳細な例は、 Introduction toRabbitMQにあります。
3. 取引所
RabbitMQでは、プロデューサーがキューに直接メッセージを送信することはありません。 代わりに、ルーティングメディエーターとして交換を使用します。
したがって、交換は、メッセージが1つのキューに送られるか、複数のキューに送られるか、または単に破棄されるかを決定します。
たとえば、ルーティング戦略に応じて、4つの交換タイプから選択できます。
- 直接–交換はルーティングキーに基づいてメッセージをキューに転送します
- ファンアウト–交換はルーティングキーを無視し、メッセージをすべての制限されたキューに転送します
- トピック–交換は、交換で定義されたパターンとキューに接続されたルーティングキーの間の一致を使用して、メッセージを境界付きキューにルーティングします
- ヘッダー–この場合、ルーティングキーの代わりに、メッセージヘッダー属性を使用して、交換を1つ以上のキューにバインドします。
さらに、取引所のプロパティを宣言する必要もあります:
- 名前–取引所の名前
- 耐久性–有効にすると、ブローカーは再起動時に取引所を削除しません
- 自動削除–このオプションが有効になっている場合、ブローカーは取引所がキューにバインドされていない場合、取引所を削除します
- オプションの引数
すべてを考慮して、交換のオプションの引数を宣言しましょう。
Map<String, Object> exchangeArguments = new HashMap<>();
exchangeArguments.put("alternate-exchange", "orders-alternate-exchange");
Alternative-exchange引数を渡すと、引数名から推測できるように、Exchangeはルーティングされていないメッセージを代替Exchangeにリダイレクトします。
次に、耐久性を有効にして自動削除を無効にした直接交換を宣言しましょう:
channel.exchangeDeclare("orders-direct-exchange", BuiltinExchangeType.DIRECT, true, false, exchangeArguments);
4. キュー
他のメッセージングブローカーと同様に、RabbitMQキューは、FIFOモデルに基づいてコンシューマーにメッセージを配信します。
さらに、キューを作成するときに、キューのいくつかのプロパティを定義できます:
- 名前–キューの名前。 定義されていない場合、ブローカーは1つを生成します
- 耐久性–有効にすると、ブローカーは再起動時にキューを削除しません
- 排他的–有効にすると、キューは1つの接続でのみ使用され、接続が閉じられると削除されます
- 自動削除–有効にすると、最後のコンシューマーがサブスクライブを解除したときにブローカーがキューを削除します
- オプションの引数
さらに、キューのオプションの引数を宣言します。
メッセージTTLと優先順位の最大数の2つの引数を追加しましょう。
Map<String, Object> queueArguments = new HashMap<>();
queueArguments.put("x-message-ttl", 60000);
queueArguments.put("x-max-priority", 10);
それでは、排他プロパティと自動削除プロパティを無効にした永続キューを宣言しましょう:
channel.queueDeclare("orders-queue", true, false, false, queueArguments);
5. バインディング
Exchangeは、バインディングを使用してメッセージを特定のキューにルーティングします。
場合によっては、ルーティングキーが添付されており、特定のメッセージをフィルタリングして制限付きキューにルーティングするために、一部の種類の交換で使用されます。
最後に、ルーティングキーを使用して、作成したキューを取引所にバインドしましょう。
channel.queueBind("orders-queue", "orders-direct-exchange", "orders-routing-key");
6. 結論
この記事では、RabbitMQのコアコンポーネントである交換、トピック、バインディングについて説明しました。 また、メッセージ配信におけるそれらの役割と、Javaアプリケーションからそれらを管理する方法についても学びました。
いつものように、このチュートリアルの完全なソースコードは、GitHubからで入手できます。