メッセージミドルウェア——RabbitMQ(六)Exchangeスイッチの核心概念を理解する!
前言
RabbitMQの重要な概念を理解するために:Exchangeスイッチ
1.Exchangeコンセプト Exchange:メッセージを受信し、ルーティングキーに従ってメッセージにバインドされたキューを転送します.
青いボックス:クライアントはスイッチにメッセージを送信し、ルーティングキーで指定したキューにルーティングします.黄色のボックス:スイッチとキューはルーティングキーでバインドされています.緑のボックス:消費者側はリスニングキューを通じてメッセージを受信します.
2.スイッチのプロパティ
3.DirectExchange(直結) DirectExchangeに送信されたすべてのメッセージは、RouteKeyで指定されたQueue に転送される.
注意:Directモードでは、RabbitMQが持つExchange:default Exchangeを使用できます.したがって、Exchangeをバインド(binding)操作する必要はありません.メッセージを転送するときは、RouteKeyがキューによって受信されるまで完全に一致しなければなりません.そうしないと、メッセージは破棄されます.
ポイント:routing keyはキューqueuesのkeyと一致しています.つまり、対応するqueueにルーティングできます.
3.1コードプレゼンテーション
プロダクション:
消費者:
テスト結果:
注意routingKeyは一貫性を保つ必要があります.routingkeyを自分で修正して、メッセージを受信できるかどうかを試してみることができます.
4. Topic Exchange Topic Exchangeに送信されたすべてのメッセージは、すべてのパイプラインRouteKeyで指定されたTopicのQueue上の に転送される. ExchangeはRouteKeyとあるTopicをファジイマッチングします.この場合、キューはTopic をバインドする必要があります.
注:ワイルドカードを使用してファジイマッチングを行うことができます
記号「#」は1つ以上の単語に一致します.
記号「*」の一致は多くない
たとえば、「log.#」は「log.info.oa」に一致します.
多くのメッセージの中で、それぞれの異なるキューは自分の必要なメッセージだけに関心を持っています.
4.1コードデモ
プロダクション:
消費者:
テスト結果:
1つの問題に注意してください:解縛が必要です
5. Fanout Exchangeルーティングキーを処理しないで、簡単にチームをスイッチにバインドする だけです.がスイッチに送信するメッセージは、スイッチにバインドされたすべてのキューに転送される . Fanoutスイッチ転送メッセージが最も速い 5.1コードプレゼンテーション
プロダクション:
消費者:
テスト結果:
6.その他
6.1 Bingding——バインド ExchangeとExchange、Queue間の接続関係 Bingdingは、RoutingKeyまたはパラメータ を含むことができる.
6.2 Queue-メッセージキューメッセージキュー、メッセージデータを実際に記憶する Durability:永続化するかどうか、Durable:はい、Transient:いいえ Auto delete:yesを選択すると、最後のリスニングが削除されると、Queueは自動的に削除されます.
6.3 Message——メッセージサーバとアプリケーションとの間で転送するデータ は本質的にデータであり、PropertiesとPayload(Body)からなる である.共通属性:delivery mode、headers(カスタム属性) 6.4その他の属性
content_type、content_encoding、priority
correlation_id、reply_to、expiration、message_id
timestamp、type、user_id、app_id、cluster_id
6.5 Virtual Host仮想ホスト仮想アドレス、論理分離のための、最上位層のメッセージルーティング Virtual HostにはいくつかのExchangeとQueue があります.同じVirtual Hostに同じ名前のExchangeまたはQueue は使用できません.
7.まとめ
RabbitMQの概念、インストールと使用、コンソール操作、RabbitMQの特性、Exchange、Queue、Binding、RoutingKey、Messageを結合してAPIを消込する説明を行い、本章の学習を通じて、RabbitMQに対して初歩的な認識があることを望んでいる.
文末
個人の微信の公衆番号に注目してください.
コードプログラミング
最新のオリジナル技術の文章と無料の学習資料を獲得して、更に大量の逸品の思惟の導図、面接の資料、PMPの予備試験の資料などがあなたが受け取ることができて、あなたがいつでもどこでも技術の知識を学ぶのに便利です!
新しいqq群を作りました:31521365、みんなが群の交流に入って一緒に勉強することを歓迎します.ありがとう!身近に必要な友達にも紹介できます.
記事はGithubに収録されています.https://github.com/CoderMerli...Gitee: https://gitee.com/573059382/c...注目してstar~参考文章:
『RabbitMQメッセージミドルウェアの詳細』
推奨記事:
メッセージミドルウェア——RabbitMQ(三)RabbitMQコア概念とAMQPプロトコルを理解する!
メッセージミドルウェア——RabbitMQ(四)コマンドラインと管理制御台の基本操作!
メッセージミドルウェア-RabbitMQ(5)生産者と消費者の迅速な入門、SpringBoot統合RabbitMQ!
RabbitMQの重要な概念を理解するために:Exchangeスイッチ
1.Exchangeコンセプト
青いボックス:クライアントはスイッチにメッセージを送信し、ルーティングキーで指定したキューにルーティングします.黄色のボックス:スイッチとキューはルーティングキーでバインドされています.緑のボックス:消費者側はリスニングキューを通じてメッセージを受信します.
2.スイッチのプロパティ
Name
:スイッチ名Type
:スイッチタイプ-direct、topic、fanout、headers、sharding(この記事では説明しない)Durability
:永続化が必要かどうか、trueは永続化Auto Delete
:最後にExchangeにバインドされたキューが削除された後、このExchange Internal
を自動的に削除します:現在のExchangeがRabbitMQ内部で使用されているかどうか、デフォルトはfalse Arguments
です.拡張パラメータは、AMQPプロトコルのカスタマイズ使用を拡張するために使用されます.3.DirectExchange(直結)
注意:Directモードでは、RabbitMQが持つExchange:default Exchangeを使用できます.したがって、Exchangeをバインド(binding)操作する必要はありません.メッセージを転送するときは、RouteKeyがキューによって受信されるまで完全に一致しなければなりません.そうしないと、メッセージは破棄されます.
ポイント:routing keyはキューqueuesのkeyと一致しています.つまり、対応するqueueにルーティングできます.
3.1コードプレゼンテーション
プロダクション:
/**
*
* @ClassName: Producer4DirectExchange
* @Description:
* @author Coder
* @date2019 7 19 22:15:52
*
*/
public class Producer4DirectExchange {
public static void main(String[] args) throws Exception {
//1 ConnectionFactory
Connection connection = ConnectionUtils.getConnection();
//2 Channel
Channel channel = connection.createChannel();
//3
String exchangeName = "test_direct_exchange";
String routingKey = "test.direct";
//4
String msg = "Coder Hello World RabbitMQ 4 Direct Exchange Message ... ";
channel.basicPublish(exchangeName, routingKey , null , msg.getBytes());
}
}
消費者:
/**
*
* @ClassName: Consumer4DirectExchange
* @Description:
* @author Coder
* @date2019 7 19 22:18:52
*
*/
public class Consumer4DirectExchange {
public static void main(String[] args) throws Exception {
// ConnectionFactory
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
//
String exchangeName = "test_direct_exchange";
String exchangeType = "direct";
String queueName = "test_direct_queue";
String routingKey = "test.direct";
//
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
//
channel.queueDeclare(queueName, false, false, false, null);
// :
channel.queueBind(queueName, exchangeName, routingKey);
//durable
QueueingConsumer consumer = new QueueingConsumer(channel);
// : 、 ACK、Consumer
channel.basicConsume(queueName, true, consumer);
//
while(true){
// , ,
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println(" :" + msg);
}
}
}
テスト結果:
注意routingKeyは一貫性を保つ必要があります.routingkeyを自分で修正して、メッセージを受信できるかどうかを試してみることができます.
4. Topic Exchange
注:ワイルドカードを使用してファジイマッチングを行うことができます
記号「#」は1つ以上の単語に一致します.
記号「*」の一致は多くない
たとえば、「log.#」は「log.info.oa」に一致します.
"log.*" "log.error"
多くのメッセージの中で、それぞれの異なるキューは自分の必要なメッセージだけに関心を持っています.
4.1コードデモ
プロダクション:
/**
*
* @ClassName: Producer4TopicExchange
* @Description:
* @author Coder
* @date2019 7 19 22:32:41
*
*/
public class Producer4TopicExchange {
public static void main(String[] args) throws Exception {
//1 ConnectionFactory
Connection connection = ConnectionUtils.getConnection();
//2 Channel
Channel channel = connection.createChannel();
//3
String exchangeName = "test_topic_exchange";
String routingKey1 = "user.save";
String routingKey2 = "user.update";
String routingKey3 = "user.delete.abc";
//4
String msg = "Coder Hello World RabbitMQ 4 Topic Exchange Message ...";
channel.basicPublish(exchangeName, routingKey1 , null , msg.getBytes());
channel.basicPublish(exchangeName, routingKey2 , null , msg.getBytes());
channel.basicPublish(exchangeName, routingKey3 , null , msg.getBytes());
channel.close();
connection.close();
}
}
消費者:
/**
*
* @ClassName: Consumer4TopicExchange
* @Description:
* @author Coder
* @date2019 7 19 22:37:12
*
*/
public class Consumer4TopicExchange {
public static void main(String[] args) throws Exception {
// ConnectionFactory
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
//
String exchangeName = "test_topic_exchange";
String exchangeType = "topic";
String queueName = "test_topic_queue";
//String routingKey = "user.*";
String routingKey = "user.*";
// 1
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
// 2
channel.queueDeclare(queueName, false, false, false, null);
// 3 :
channel.queueBind(queueName, exchangeName, routingKey);
//durable
QueueingConsumer consumer = new QueueingConsumer(channel);
// : 、 ACK、Consumer
channel.basicConsume(queueName, true, consumer);
//
while(true){
// , ,
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println(" :" + msg);
}
}
}
テスト結果:
1つの問題に注意してください:解縛が必要です
5. Fanout Exchange
プロダクション:
/**
*
* @ClassName: Producer4FanoutExchange
* @Description:
* @author Coder
* @date2019 7 19 23:01:16
*
*/
public class Producer4FanoutExchange {
public static void main(String[] args) throws Exception {
//1 ConnectionFactory
Connection connection = ConnectionUtils.getConnection();
//2 Channel
Channel channel = connection.createChannel();
//3
String exchangeName = "test_fanout_exchange";
//4
for(int i = 0; i < 10; i ++) {
String msg = "Coder Hello World RabbitMQ 4 FANOUT Exchange Message ...";
channel.basicPublish(exchangeName, "", null , msg.getBytes());
}
channel.close();
connection.close();
}
}
消費者:
/**
*
* @ClassName: Consumer4FanoutExchange
* @Description:
* @author Coder
* @date2019 7 19 23:21:18
*
*/
public class Consumer4FanoutExchange {
public static void main(String[] args) throws Exception {
// ConnectionFactory
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
//
String exchangeName = "test_fanout_exchange";
String exchangeType = "fanout";
String queueName = "test_fanout_queue";
String routingKey = ""; //
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
channel.queueDeclare(queueName, false, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);
//durable
QueueingConsumer consumer = new QueueingConsumer(channel);
// : 、 ACK、Consumer
channel.basicConsume(queueName, true, consumer);
//
while(true){
// , ,
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println(" :" + msg);
}
}
}
テスト結果:
6.その他
6.1 Bingding——バインド
6.2 Queue-メッセージキュー
6.3 Message——メッセージ
content_type、content_encoding、priority
correlation_id、reply_to、expiration、message_id
timestamp、type、user_id、app_id、cluster_id
6.5 Virtual Host仮想ホスト
7.まとめ
RabbitMQの概念、インストールと使用、コンソール操作、RabbitMQの特性、Exchange、Queue、Binding、RoutingKey、Messageを結合してAPIを消込する説明を行い、本章の学習を通じて、RabbitMQに対して初歩的な認識があることを望んでいる.
文末
個人の微信の公衆番号に注目してください.
コードプログラミング
最新のオリジナル技術の文章と無料の学習資料を獲得して、更に大量の逸品の思惟の導図、面接の資料、PMPの予備試験の資料などがあなたが受け取ることができて、あなたがいつでもどこでも技術の知識を学ぶのに便利です!
新しいqq群を作りました:31521365、みんなが群の交流に入って一緒に勉強することを歓迎します.ありがとう!身近に必要な友達にも紹介できます.
記事はGithubに収録されています.https://github.com/CoderMerli...Gitee: https://gitee.com/573059382/c...注目してstar~参考文章:
『RabbitMQメッセージミドルウェアの詳細』
推奨記事:
メッセージミドルウェア——RabbitMQ(三)RabbitMQコア概念とAMQPプロトコルを理解する!
メッセージミドルウェア——RabbitMQ(四)コマンドラインと管理制御台の基本操作!
メッセージミドルウェア-RabbitMQ(5)生産者と消費者の迅速な入門、SpringBoot統合RabbitMQ!