RM新时代网站-首页

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

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

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

RabbitMQ中的路由模型(direct)

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

路由模型

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

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

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

適用場景

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

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

演示

  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. 消費者

    // 消費者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);
        }
    }
    
  3. 測試
    先啟動2個消費者,再啟動生產(chǎn)者
    可以得到結(jié)果是消費者1得到了序號是偶數(shù)的消息
    消費者2得到了序號是奇數(shù)的消息

小結(jié)

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

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

    關(guān)注

    21

    文章

    2637

    瀏覽量

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

    關(guān)注

    0

    文章

    278

    瀏覽量

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

    關(guān)注

    1

    文章

    3226

    瀏覽量

    48807
  • Direct
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    11155
  • rabbitmq
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    1026
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    RabbitMq入門教程

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

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

    RabbitMQ 是一個功能強大的開源消息隊列系統(tǒng),它實現(xiàn)了高效的消息通信和異步處理。
    的頭像 發(fā)表于 01-03 10:22 ?1920次閱讀
    基于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 ?568次閱讀
    什么情況下使用<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 ?596次閱讀
    什么情況下使用<b class='flag-5'>RabbitMQ</b>或 Kafka

    RabbitMQ:消息傳遞的中介

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

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

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

    RocketMQ和RabbitMQ的區(qū)別

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

    Topic 模型的使用

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

    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 ?1389次閱讀
    RM新时代网站-首页