一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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來約束隊列與交換機的綁定。

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

適用場景

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

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

    // 消費者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)注

    22

    文章

    2747

    瀏覽量

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

    關(guān)注

    0

    文章

    280

    瀏覽量

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

    關(guān)注

    1

    文章

    3521

    瀏覽量

    50442
  • Direct
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    11319
  • rabbitmq
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    1158
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

    RabbitMq入門教程

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

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

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

    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 ?763次閱讀
    什么情況下使用<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 ?844次閱讀
    什么情況下使用<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 ?1328次閱讀

    RocketMQ和RabbitMQ的區(qū)別

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

    Topic 模型的使用

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

    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 ?2139次閱讀

    rabbitmq高可用集群搭建

    在進行RabbitMQ搭建時,我們基于現(xiàn)有的連接數(shù)據(jù)和業(yè)務(wù)需求進行了深入分析。目前的統(tǒng)計數(shù)據(jù)顯示,連接數(shù)為631,隊列數(shù)為80418。為了確保業(yè)務(wù)需求的順利滿足,我們需要在云產(chǎn)品和自建RabbitMQ消息隊列服務(wù)之間做出選擇。
    的頭像 發(fā)表于 03-12 14:29 ?511次閱讀
    <b class='flag-5'>rabbitmq</b>高可用集群搭建

    RabbitMQ消息隊列解決方案

    在現(xiàn)代分布式系統(tǒng)架構(gòu),消息隊列作為核心組件,承擔(dān)著系統(tǒng)解耦、異步處理、流量削峰等重要職責(zé)。RabbitMQ作為一款成熟的消息隊列中間件,以其高可用性、高可靠性和豐富的特性,成為眾多企業(yè)的首選方案。本文將從運維工程師的角度,詳細(xì)闡述Ra
    的頭像 發(fā)表于 07-08 15:55 ?191次閱讀