衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RabbitMQ中的路由模型(direct)

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-09-25 11:32 ? 次閱讀

路由模型

RabbitMQ 提供了五種不同的通信模型,上一篇文章中,簡單的介紹了一下RabbitMQ的發(fā)布訂閱模型模型。這篇文章來學(xué)習(xí)一下RabbitMQ中的路由模型(direct)。

路由模型(direct):路由模式相當(dāng)于是分布訂閱模式的升級版,多了一個 路由key來約束隊列與交換機(jī)的綁定。

在路由模型中,生產(chǎn)者將消息發(fā)送到交換機(jī),交換機(jī)根據(jù)消息的路由鍵將消息轉(zhuǎn)發(fā)到對應(yīng)的隊列中。每個隊列可以綁定多個路由鍵,每個路由鍵可以綁定到多個隊列中。消費(fèi)者從隊列中接收消息并處理。當(dāng)一個路由鍵被多個隊列綁定時,交換機(jī)會將消息發(fā)送到所有綁定的隊列中。當(dāng)一個隊列綁定多個路由鍵時,該隊列將能夠接收到所有路由鍵對應(yīng)的消息。

適用場景

路由模型適用于需要點(diǎn)對點(diǎn)通信的場景,例如:

  1. 系統(tǒng)監(jiān)控告警通知;
  2. 任務(wù)分發(fā);
  3. 用戶私信系統(tǒng);
  4. 訂單確認(rèn)通知等。

演示

  1. 生產(chǎn)者

    // 生產(chǎn)者
    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, ("路由模型發(fā)送的第 " + i + " 條信息").getBytes());
                } else {
                    channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2, null, ("路由模型發(fā)送的第 " + i + " 條信息").getBytes());
                }
            }
            channel.close();
            connection.close();
        }
    }
    
  2. 消費(fèi)者

    // 消費(fèi)者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("消費(fèi)者1接收到的消息是:" + new String(body));
                }
            };
            channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
        }
    }
    
    // 消費(fèi)者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("消費(fèi)者2接收到的消息是:" + new String(body));
                }
            };
            channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
        }
    }
    
  3. 測試
    先啟動2個消費(fèi)者,再啟動生產(chǎn)者
    可以得到結(jié)果是消費(fèi)者1得到了序號是偶數(shù)的消息
    消費(fèi)者2得到了序號是奇數(shù)的消息

小結(jié)

本文介紹了 RabbitMQ 通信模型中的路由模型的使用,通過交換機(jī)和路由鍵實現(xiàn)點(diǎn)對點(diǎn)通信,適合于需要點(diǎn)對點(diǎn)通信的場景。在實際使用過程中,需要注意以下幾點(diǎn):

  1. 路由鍵必須要與消費(fèi)者綁定隊列時的路由鍵相同,否則無法接收到消息;
  2. 可以通過多個交換機(jī)和路由鍵來實現(xiàn)更靈活的消息路由。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 交換機(jī)
    +關(guān)注

    關(guān)注

    21

    文章

    2656

    瀏覽量

    100179
  • 路由
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    41930
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3305

    瀏覽量

    49221
  • Direct
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    11180
  • rabbitmq
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    1042
收藏 人收藏

    評論

    相關(guān)推薦

    RabbitMQ的發(fā)布訂閱模型

    上一篇文章,簡單的介紹了一下RabbitMQ的work模型。這篇文章來學(xué)習(xí)一下RabbitMQ的發(fā)布訂閱
    的頭像 發(fā)表于 09-25 14:30 ?572次閱讀
    <b class='flag-5'>RabbitMQ</b><b class='flag-5'>中</b>的發(fā)布訂閱<b class='flag-5'>模型</b>

    RabbitMQ通信模型的work模型

    上一篇文章,簡單的介紹了一下RabbitMQ,以及安裝和hello world。 有的小伙伴留言說看不懂其中的方法參數(shù),這里先解釋一下幾個基本的方法參數(shù)。 // 聲明隊列方法
    的頭像 發(fā)表于 09-25 14:34 ?549次閱讀
    <b class='flag-5'>RabbitMQ</b>通信<b class='flag-5'>模型</b><b class='flag-5'>中</b>的work<b class='flag-5'>模型</b>

    RabbitMQ是什么

    在工作中經(jīng)常會用到消息隊列處理各種問題,今天指北君帶領(lǐng)大家來學(xué)一個很常用到的技術(shù)-RabbitMQ;接下來還會有關(guān)于RabbitMQ的系列教程,對你有幫助的話記得關(guān)注哦~ RabbitMQ
    的頭像 發(fā)表于 09-25 14:36 ?919次閱讀
    <b class='flag-5'>RabbitMQ</b>是什么

    RabbitMq入門教程

    RabbitMQ是一個開源的,在AMQP基礎(chǔ)上完整的,可復(fù)用的企業(yè)消息系統(tǒng)。
    的頭像 發(fā)表于 12-04 11:10 ?551次閱讀
    <b class='flag-5'>RabbitMq</b>入門教程

    基于Docker Compose部署RabbitMQ的經(jīng)驗分享

    RabbitMQ 是一個功能強(qiáng)大的開源消息隊列系統(tǒng),它實現(xiàn)了高效的消息通信和異步處理。
    的頭像 發(fā)表于 01-03 10:22 ?2058次閱讀
    基于Docker Compose部署<b class='flag-5'>RabbitMQ</b>的經(jīng)驗分享

    Rabbitmq與esp-open-rtos集成失敗了怎么解決?

    我嘗試將 Rabbitmq 與 esp-open-rtos 集成,但失敗了。 誰能幫忙?
    發(fā)表于 05-10 11:45

    多態(tài)路由承載的內(nèi)容分發(fā)模型

    針對命名數(shù)據(jù)網(wǎng)絡(luò)( NDN)難以保障多樣化業(yè)務(wù)服務(wù)需求問題,提出了多態(tài)路由承載的內(nèi)容分發(fā)模型( CDMPR)。該模型通過內(nèi)容請求、路由計算、內(nèi)容查表和內(nèi)容緩存四種類型的重構(gòu)模塊組合來承
    發(fā)表于 12-06 17:04 ?0次下載
    多態(tài)<b class='flag-5'>路由</b>承載的內(nèi)容分發(fā)<b class='flag-5'>模型</b>

    RabbitMQ-CN RabbitMQ中文文檔

    RabbitMQ_into_Chinese.zip
    發(fā)表于 04-19 10:51 ?0次下載
    <b class='flag-5'>RabbitMQ</b>-CN <b class='flag-5'>RabbitMQ</b>中文文檔

    什么情況下使用RabbitMQ或 Kafka

    如果你問自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在這里阻止你。本文將從更廣泛的角度討論這兩種情況。它關(guān)注的是這兩個系統(tǒng)提供的功能,并將指導(dǎo)您做出正確的決定,決定何時使用哪個系統(tǒng)。
    的頭像 發(fā)表于 02-22 10:35 ?607次閱讀
    什么情況下使用<b class='flag-5'>RabbitMQ</b>或 Kafka

    什么情況下使用RabbitMQ或 Kafka

    如果你問自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在這里阻止你。本文將從更廣泛的角度討論這兩種情況。它關(guān)注的是這兩個系統(tǒng)提供的功能,并將指導(dǎo)您做出正確的決定,決定何時使用哪個系統(tǒng)。
    的頭像 發(fā)表于 02-24 11:12 ?638次閱讀
    什么情況下使用<b class='flag-5'>RabbitMQ</b>或 Kafka

    RabbitMQ:消息傳遞的中介

    電子發(fā)燒友網(wǎng)站提供《RabbitMQ:消息傳遞的中介.zip》資料免費(fèi)下載
    發(fā)表于 06-14 16:08 ?0次下載
    <b class='flag-5'>RabbitMQ</b>:消息傳遞的中介

    rabbitmq是什么?rabbitmq安裝、原理、部署

    rabbitmq是什么? MQ的全稱是Messagee Queue,因為消息的隊列是隊列,所以遵循FIFO 先進(jìn)先出的原則是上下游傳遞信息的跨過程通信機(jī)制。 RabbitMQ是一套開源(MPL
    的頭像 發(fā)表于 07-19 13:50 ?1079次閱讀

    RocketMQ和RabbitMQ的區(qū)別

    化:RocketMQ將消息存儲在磁盤上,保證消息的可靠性;RabbitMQ默認(rèn)將消息保存在內(nèi)存,可以通過插件進(jìn)行持久化。 可用性:RocketMQ具備分布
    的頭像 發(fā)表于 07-24 13:39 ?1.4w次閱讀

    Topic 模型的使用

    RabbitMQ 是一個流行的開源消息隊列軟件,它提供了多種通信模型,例如發(fā)布/訂閱模型路由模型、work
    的頭像 發(fā)表于 09-25 11:30 ?713次閱讀

    redis和rabbitMQ的區(qū)別

    Redis和RabbitMQ之間的區(qū)別。 架構(gòu)設(shè)計: Redis是一個內(nèi)存存儲系統(tǒng),它將數(shù)據(jù)存儲在內(nèi)存,以提供快速的讀寫訪問。因此,Redis的存儲能力受到內(nèi)存大小的限制。它使用發(fā)布/訂閱模式來處理消息隊列,發(fā)布者將消息發(fā)送到頻道,訂閱者從頻道接收消息。
    的頭像 發(fā)表于 12-04 14:48 ?1521次閱讀
    莫斯科百家乐官网的玩法技巧和规则| 百家乐在线娱乐可信吗| 大发888赌场是干什么的| 网络百家乐官网游赌博| 百家乐币| 稷山县| 真人百家乐ea平台| 太阳城百家乐| 伟易博百家乐现金网| 千亿娱乐| 转载24山五行相克| 皇家赌场| 爱拼百家乐现金网| 囊谦县| 百家乐最佳投注办法| 红桥区| 百家乐龙虎| 百家乐官网游戏怎么刷钱| 优博百家乐官网的玩法技巧和规则 | 博赢国际娱乐城| 澳门百家乐娱乐场| 怀远县| 淘金百家乐的玩法技巧和规则| 百家乐官网现金游戏注册送彩金| 牌九百家乐的玩法技巧和规则| 澳门百家乐官网海星王娱乐城| 百家乐桌套装| 百家乐官网的玩法技巧和规则| 六合彩图片| 百家乐注册送10彩金| 百家乐官网事电影| 威尼斯人娱乐城易博lm0| 哪家百家乐官网最好| bet365合法吗| 做生意佩戴什么纳财| 百家乐官网高手qq| 百家乐五铺的缆是什么意思| 赢家百家乐官网的玩法技巧和规则| 国际豪门娱乐| 百家乐一邱大师打法| 百家乐官网e78|