二級網(wǎng)站建設比較好用的搜索引擎
文章目錄
- Topic 交換機概述
- Routing Key 與 Binding Key
- 優(yōu)缺點及場景
- 優(yōu)點
- 缺點
- 應用場景
- 案例演示
- 創(chuàng)建隊列和交換機:
- 消費者代碼:
- 消息發(fā)送代碼:
- 測試:
- 總結
Topic 交換機概述
- 路由機制: Topic交換機與Direct交換機類似,也是基于
routing key
進行消息路由。 - Routing Key 格式: 通常由多個單詞組成,用點 (
.
) 分隔。例如:china.news
,china.weather
,等等。 - 含義: 每個單詞代表某種特定含義,如
china.news
表示中國的新聞,china.weather
表示中國的天氣。
Routing Key 與 Binding Key
- Routing Key: 發(fā)送消息時指定的路由鍵,通常由多個單詞組成。
- Binding Key: 隊列和交換機之間的綁定鍵,也可以由多個單詞組成,允許使用通配符。
- 通配符
*
星號: 表示一個單詞。用于匹配一個具體的單詞。#
井號: 表示零個或多個單詞。用于匹配多個單詞或完全不匹配。- 示例:
china.#
:匹配以china
開頭的任何消息,如china.news
、china.weather
都匹配。*.news
:匹配任何以.news
結尾的消息,如china.news
、japan.news
等。china.*
:只匹配china
后跟一個單詞的消息,如china.news
,但不匹配china.weather
。
優(yōu)缺點及場景
優(yōu)點
- 靈活性: 使用通配符可以減少綁定多個鍵的復雜性。例如,
china.#
可以代替多個綁定china.news
,china.weather
等。 - 擴展性: 如果后續(xù)添加新的消息類型(如
china.sports
),不需要修改現(xiàn)有配置,直接匹配china.#
就能涵蓋新類型。
缺點
- 性能影響: 通配符匹配比直接匹配消耗更多的計算資源,雖然影響較小。
應用場景
- 適合多種類型的消息路由: 如果有多個不同的消息類型(如新聞、天氣),并且這些類型有相似的前綴或后綴,使用
topic
交換機可以大大簡化配置。 - 可動態(tài)擴展: 當新的消息類型出現(xiàn)時,只需要簡單地添加通配符綁定,無需多次配置。
案例演示
利用 SpringAMQP 演示 TopicExchange 的使用
- 在 RabbitMQ 控制臺中,聲明隊列 topic.queue1 和 topic.queue2
- 在RabbitMQ 控制臺中,聲明交換機 hmall.topic,將兩個隊列與其綁定
- 在 consumer 服務中,編寫兩個消費者方法,分別監(jiān)聽 topic.queue1 和 topic.queue2
- 在 publisher 中編寫測試方法,向 hamll.topic 發(fā)送消息
創(chuàng)建隊列和交換機:
-
在 RabbitMQ 控制臺創(chuàng)建兩個隊列
topic.queue1
和topic.queue2
,以及一個topic
類型的交換機nhuan.topic
。
-
使用
china.#
和*.news
作為binding key
進行綁定。
消費者代碼:
- 創(chuàng)建兩個消費者,分別監(jiān)聽
topic.queue1
和topic.queue2
。
@RabbitListener(queues = "topic.queue1")
public void listenTopicQueue1(String message) {log.info("消費者1接收到 topic.queue1 的消息: " + message);
}@RabbitListener(queues = "topic.queue2")
public void listenTopictQueue2(String message) {log.info("消費者2接收到 topic.queue2 的消息: " + message);
}
消息發(fā)送代碼:
- 使用
rabbitTemplate.convertAndSend
發(fā)送消息到指定的交換機,并設置routing key
。
@Test
public void testTopicQueue1() {// 交換機名稱String exchangeName = "nhuan.topic";// 消息String message = "新聞:中國收復小日子。";// 發(fā)送消息rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
}@Test
public void testTopicQueue2() {// 交換機名稱String exchangeName = "nhuan.topic";// 消息String message = "天氣:今天天氣不錯。";// 發(fā)送消息rabbitTemplate.convertAndSend(exchangeName, "china.weather", message);
}
測試:
china.news
會同時匹配topic.q1
和topic.q2
,所以兩個消費者都會收到。
china.weather
只會匹配topic.queue1
,所以只有消費者1收到消息。
總結
- 與 Direct 交換機的區(qū)別: Topic交換機使用多單詞組成的
routing key
,并且支持通配符匹配,提供更大的靈活性和擴展性。 - 適合的場景: 當需要根據(jù)不同的消息類型(如不同國家的新聞、天氣等)進行路由時,
topic
交換機非常合適。