路由模型
RabbitMQ 提供了五種不同的通信模型,上一篇文章中,簡單的介紹了一下RabbitMQ的發布訂閱模型模型。這篇文章來學習一下RabbitMQ中的路由模型(direct)。
路由模型(direct):路由模式相當于是分布訂閱模式的升級版,多了一個 路由key來約束隊列與交換機的綁定。
在路由模型中,生產者將消息發送到交換機,交換機根據消息的路由鍵將消息轉發到對應的隊列中。每個隊列可以綁定多個路由鍵,每個路由鍵可以綁定到多個隊列中。消費者從隊列中接收消息并處理。當一個路由鍵被多個隊列綁定時,交換機會將消息發送到所有綁定的隊列中。當一個隊列綁定多個路由鍵時,該隊列將能夠接收到所有路由鍵對應的消息。
適用場景
路由模型適用于需要點對點通信的場景,例如:
- 系統監控告警通知;
- 任務分發;
- 用戶私信系統;
- 訂單確認通知等。
演示
生產者
// 生產者 public class Producer { private static final String EXCHANGE_NAME = "exchange_direct_1"; // 定義路由的key,key值是可以隨意定義的 private static final String EXCHANGE_ROUTING_KEY1 = "direct_km1"; private static final String EXCHANGE_ROUTING_KEY2 = "direct_km2"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = ConnectionUtils.getConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare(EXCHANGE_NAME, "direct"); for (int i = 0; i < 100; i++) { if (i % 2 == 0) { channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1, null, ("路由模型發送的第 " + i + " 條信息").getBytes()); } else { channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2, null, ("路由模型發送的第 " + i + " 條信息").getBytes()); } } channel.close(); connection.close(); } }消費者
// 消費者1 public class Consumer { private static final String QUEUE_NAME = "queue_direct_1"; private static final String EXCHANGE_NAME = "exchange_direct_1"; private static final String EXCHANGE_ROUTING_KEY1 = "direct_km1"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = ConnectionUtils.getConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); channel.exchangeDeclare(EXCHANGE_NAME, "direct"); channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者1接收到的消息是:" + new String(body)); } }; channel.basicConsume(QUEUE_NAME, true, defaultConsumer); } }// 消費者2 public class Consumer2 { private static final String QUEUE_NAME = "queue_direct_2"; private static final String EXCHANGE_NAME = "exchange_direct_1"; private static final String EXCHANGE_ROUTING_KEY2 = "direct_km2"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = ConnectionUtils.getConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); channel.exchangeDeclare(EXCHANGE_NAME, "direct"); channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消費者2接收到的消息是:" + new String(body)); } }; channel.basicConsume(QUEUE_NAME, true, defaultConsumer); } }測試
先啟動2個消費者,再啟動生產者
可以得到結果是消費者1得到了序號是偶數的消息
消費者2得到了序號是奇數的消息
小結
本文介紹了 RabbitMQ 通信模型中的路由模型的使用,通過交換機和路由鍵實現點對點通信,適合于需要點對點通信的場景。在實際使用過程中,需要注意以下幾點:
- 路由鍵必須要與消費者綁定隊列時的路由鍵相同,否則無法接收到消息;
- 可以通過多個交換機和路由鍵來實現更靈活的消息路由。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
交換機
+關注
關注
23文章
2922瀏覽量
104677 -
路由
+關注
關注
0文章
285瀏覽量
43744 -
模型
+關注
關注
1文章
3805瀏覽量
52225 -
Direct
+關注
關注
0文章
15瀏覽量
11473 -
rabbitmq
+關注
關注
0文章
20瀏覽量
1293
發布評論請先 登錄
相關推薦
熱點推薦
RabbitMQ通信模型中的work模型
上一篇文章中,簡單的介紹了一下RabbitMQ,以及安裝和hello world。 有的小伙伴留言說看不懂其中的方法參數,這里先解釋一下幾個基本的方法參數。 // 聲明隊列方法
RabbitMQ是什么
在工作中經常會用到消息隊列處理各種問題,今天指北君帶領大家來學一個很常用到的技術-RabbitMQ;接下來還會有關于RabbitMQ的系列教程,對你有幫助的話記得關注哦~ RabbitMQ
什么情況下使用RabbitMQ或 Kafka
如果你問自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在這里阻止你。本文將從更廣泛的角度討論這兩種情況。它關注的是這兩個系統提供的功能,并將指導您做出正確的決定,決定何時使用哪個系統。
什么情況下使用RabbitMQ或 Kafka
如果你問自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在這里阻止你。本文將從更廣泛的角度討論這兩種情況。它關注的是這兩個系統提供的功能,并將指導您做出正確的決定,決定何時使用哪個系統。
rabbitmq是什么?rabbitmq安裝、原理、部署
rabbitmq是什么? MQ的全稱是Messagee Queue,因為消息的隊列是隊列,所以遵循FIFO 先進先出的原則是上下游傳遞信息的跨過程通信機制。 RabbitMQ是一套開源(MPL
RocketMQ和RabbitMQ的區別
化:RocketMQ將消息存儲在磁盤上,保證消息的可靠性;RabbitMQ默認將消息保存在內存中,可以通過插件進行持久化。 可用性:RocketMQ具備分布
redis和rabbitMQ的區別
Redis和RabbitMQ之間的區別。 架構設計: Redis是一個內存存儲系統,它將數據存儲在內存中,以提供快速的讀寫訪問。因此,Redis的存儲能力受到內存大小的限制。它使用發布/訂閱模式來處理消息隊列,發布者將消息發送到頻道,訂閱者從頻道接收消息。
rabbitmq高可用集群搭建
在進行RabbitMQ搭建時,我們基于現有的連接數據和業務需求進行了深入分析。目前的統計數據顯示,連接數為631,隊列數為80418。為了確保業務需求的順利滿足,我們需要在云產品和自建RabbitMQ消息隊列服務之間做出選擇。
RabbitMQ消息隊列解決方案
在現代分布式系統架構中,消息隊列作為核心組件,承擔著系統解耦、異步處理、流量削峰等重要職責。RabbitMQ作為一款成熟的消息隊列中間件,以其高可用性、高可靠性和豐富的特性,成為眾多企業的首選方案。本文將從運維工程師的角度,詳細闡述Ra
RabbitMQ中的路由模型(direct)
評論