色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

Topic 模型的使用

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

RabbitMQ 是一個流行的開源消息隊列軟件,它提供了多種通信模型,例如發布/訂閱模型、路由模型、work模型等。在前面的文章中我們已經介紹了前四種模型,本文將會學習 RabbitMQ 中的 Topic 模型;接下來還會有關于RabbitMQ的系列教程,對你有幫助的話記得關注哦~

Topic 模型

Topic 模型是 RabbitMQ 的高級模型之一,Topic 模型使用了通配符的概念,可以匹配更靈活的路由規則。topic模式相當于是對路由模式的一個升級,topic模式主要就是在匹配的規則上可以實現模糊匹配。

在 Topic 模型中,生產者將消息發送到交換機,交換機根據消息的 routing key 將消息轉發到對應的隊列中。與 Direct 模型不同的是,Topic 模型中 routing key 支持通配符匹配,其中 ' ' 可以匹配一個單詞,'#' 可以匹配多個單詞。例如,"order. " 可以匹配 "order.create","order.delete" 等消息,而 "order.#" 可以匹配 "order.create.one","order.delete.two" 等消息。

適用場景

Topic 模型適用于需要靈活的消息路由規則的場景,例如:

  1. 新聞網站訂閱分類消息;
  2. 電商網站訂閱商品分類消息;
  3. 金融機構訂閱股票市場消息等。

演示

  1. 生產者

    // 生產者
    public class Producer {
        private static final String EXCHANGE_NAME = "exchange_topic_1";
        private static final String EXCHANGE_ROUTING_KEY1 = "topic.km";
        private static final String EXCHANGE_ROUTING_KEY2 = "topic.km.001";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();
            channel.exchangeDeclare(EXCHANGE_NAME, "topic");
            for (int i = 0; i < 100; i++) {
                // topic在路由模型的基礎上,只有路由的key發生改變,其余的都不變
                if (i % 2 == 0) {
                    channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1, MessageProperties.PERSISTENT_TEXT_PLAIN, ("topic模型發送的第 " + i + " 條信息").getBytes());
                } else {
                    channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2, MessageProperties.PERSISTENT_TEXT_PLAIN, ("topic模型發送的第 " + i + " 條信息").getBytes());
                }
            }
            channel.close();
            connection.close();
        }
    }
    
  2. 消費者

    // 消費者1
    public class Consumer1 {
        private static final String QUEUE_NAME = "queue_topic_1";
        private static final String EXCHANGE_NAME = "exchange_topic_1";
        private static final String EXCHANGE_ROUTING_KEY = "topic.*";
    
        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, "topic");
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY);
            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_topic_2";
        private static final String EXCHANGE_NAME = "exchange_topic_1";
        private static final String EXCHANGE_ROUTING_KEY = "topic.#";
    
        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, "topic");
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY);
            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訂閱的是 "order.*" 的消息,消費者2訂閱的是 "order.#" 的消息,可以得到以下結果:

消費者1接收到的消息是:"Topic 模型發送的偶數條消息"

消費者2接收到的消息是:"Topic 模型發送的全部消息"

小結

本文介紹了 RabbitMQ 通信模型中的 Topic 模型的使用,通過交換機和 routing key 實現更靈活的消息路由。在實際使用過程中,需要注意以下幾點:

  1. 路由鍵的格式應該是多個單詞組成,用 '.' 分隔;
  2. '#' 匹配多個單詞,'*' 匹配一個單詞;
  3. 一個隊列可以綁定多個 routing key;
  4. 如果交換機沒有匹配到任何一個隊列,則會拋棄該消息。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 交換機
    +關注

    關注

    21

    文章

    2637

    瀏覽量

    99535
  • 模型
    +關注

    關注

    1

    文章

    3226

    瀏覽量

    48809
  • rabbitmq
    +關注

    關注

    0

    文章

    17

    瀏覽量

    1026
收藏 人收藏

    評論

    相關推薦

    阿里云設備的物模型數據里面始終沒有值是為什么?

    如上圖,不知道講清楚沒有。 IG502自定義TOPIC 上發到阿里云沒問題。采用阿里云物模型的格式來上發就不行。請大佬指教!
    發表于 07-24 07:49

    LabVIEW編寫的簡單3D模型預覽工具

    ` 本帖最后由 ewb_topic 于 2018-8-7 16:29 編輯 最低兼容LabVIEW 8.6版本,支持ase、stl、wrl三種3D模型文件。小工具一個Pass:tlatlatla`
    發表于 08-06 10:55

    IoT物聯網平臺通信用Topic梳理

    簡介: 基于設備實踐梳理出來的Topic總結1.前言IoT物聯網平臺基于MQTT協議的Pub/Sub通信,那么topic和payload設計就很重要。我們可以定義出不同topic來處理不同業務場景
    發表于 11-07 14:08

    人機交互Topic推薦-AMiner 精選資料分享

    數據和實驗平臺。必讀論文:https://www.aminer.cn/topic人機交互、人機互動(英文:...
    發表于 09-10 07:16

    Topic通訊小結

    ROS實操入門系列(三)1、Topic通訊小結2、編寫ros驅動實現電機控制和編碼器讀取Topic通訊小結控制板驅動代碼實現及工具調試完整代碼Topic通訊小結Topic通訊特點通訊
    發表于 09-16 09:11

    想問一下有沒有MQTT SUBSCRIBE topic之後接收MESSAGE的例子?

    想問一下有沒有MQTT SUBSCRIBE topic 之後接收MESSAGE的例子?我只找到Code: Select all case MQTT_EVENT_DATA: {ESP_LOGI(TAG
    發表于 02-17 09:04

    請問一下MQTT_topic_t 結構在哪里呢?

    ;MQTT_EVENT_CONNECTED"); mqtt_topic_t *mqtt_topic = get_mqtt_topic(); msg_id = esp_mqtt_client_publish(client
    發表于 03-02 06:30

    集成電路工藝專題實驗 Topic Experiments o

    集成電路工藝專題實驗 Topic Experiments of Integrate Circuit Techniques 實驗一 硅單晶(或多晶)薄膜的沉積………………………………………………………3實驗二 硅單晶外延層的質
    發表于 03-06 14:06 ?5次下載

    TEP(Topic Embedded Products) 產品攜手基于Zynq的開發工具和系統模塊加速嵌入式設計

    Dyplo 開發系統可以讓設計工程師很容易使FPGA進行硬件加速 作者:Steve Leibson, 賽靈思戰略營銷與業務規劃總監 荷蘭的Topic 公司幫助客戶開發了不同應用領域的嵌入式產品,包括
    發表于 02-08 08:13 ?327次閱讀

    基于ESCM的動態主題情感混合模型

    針對現有模型無法進行微博主題情感演化分析的問題,提出一種基于主題情感混合模型( TSCM)和情感周期性理論的主題情感演化模型動態主題情感混合模型( DTSCM)。DTSCM通過捕獲不同
    發表于 01-02 10:38 ?0次下載

    Point Topic宣布:全球固網寬帶用戶已經突破10億

    近日,市場研究公司Point Topic宣布,全球固網寬帶用戶已經突破10億,其中80%是光纖連接用戶?;贏DSL的寬帶用戶數同比去年同期減少了8%。
    發表于 10-31 09:01 ?1357次閱讀

    Topic醫療開發平臺的最新進展

    Xilinx醫療產品營銷經理Kamran Khan和Topic Embedded Products首席執行官Rieny Rijnen分享了由Xilinx Zynq All Programmable SoC實現的Topic醫療開發平臺的最新進展,共同解決了這一問題。
    的頭像 發表于 11-22 06:51 ?3306次閱讀

    如何在LoRaWAN網關的網頁上設置MQTT的訂閱的Topic

    當我們將LoRaWAN網關設置為NS模式時可參見文章《將LoRaWAN網關設置為NS模式的操作方法》,我們就可以在LoRaWAN網關的網頁上進行操作,以設置該網關的MQTT訂閱的topic,從而
    發表于 06-12 17:29 ?1573次閱讀

    面向微博熱點話題的改進BBTM模型

    針對目前基于主題模型的微博短文本熱點話題發現存在特征稀疏、高維度以及需要人工指定主題數目等問題,提出一種基于改進突發詞對主題模型( bursty biterm topic model,BBTM
    發表于 06-09 14:20 ?3次下載

    如何在LoRaWAN網關上設置MQTT的Topic

    當我們將LoRaWAN網關設置為NS模式時,可參見文章如何將LoRaWAN網關設置為NS模式,我們就可以在LoRaWAN網關的網頁上進行操作,以設置該網關的MQTT訂閱的topic,從而為接下來采用MQTT訂閱獲取到LoRa節點數據建立基礎。
    發表于 08-20 10:10 ?1165次閱讀
    主站蜘蛛池模板: 18黄女脱内衣| 欧洲美女人 一级毛片| 解开美女胸衣2破解版| 国产成人精品亚洲线观看| 国产精品视频人人做人人爽| 国产偷国产偷亚洲高清SWAG| 久久re这里视频精品8| 琪琪色原网20岁以下热热色原网站| 日本高清加勒比| 亚洲乱码高清午夜理论电影| 中国农村真实bbwbbwbbw| YY600800新视觉理论私人| 高h乱np甄宓| 精品久久中文字幕有码| 欧美91精品久久久久网免费| 四虎亚洲中文字幕永久在线| 在线观看国产区| 国产1000部成人免费视频| 黑丝美女娇喘| 入禽太深免费视频10| 印度性hd18| 国产色婷婷精品人妻蜜桃成熟时| 美女全光末满18勿进| 熟女强奷系列中文字幕| 色噜噜噜亚洲男人的天堂| 上课失禁丨vk| 成人影片下载网站| 欧美日韩亚洲中字二区| 99热最新在线| 欧美乱码伦视频免费66网| 亚洲字幕在线观看| 国产美女又黄又爽又色视频网站| 欧美精品华人在线| 99久久99| 伦理79电影网在线观看| 亚洲色噜噜狠狠网站| 国产高清在线观看视频| 日本毛片久久国产精品| 68日本xxxxxxxx79| 老湿司午夜爽爽影院榴莲视频| 无遮掩H黄纯肉动漫在线观看星|