RabbitMQ中的Topic模式

在現代分布式系統中,消息隊列(Message Queue)是實現異步通信、解耦系統組件的重要工具。RabbitMQ 是一個廣泛使用的開源消息代理,支持多種消息傳遞模式,其中 Topic 模式 是一種靈活且強大的模式,允許生產者和消費者通過通配符匹配的方式進行消息傳遞。本文將深入探討 RabbitMQ 中 Topic 模式的工作原理,并通過 Java 代碼示例展示其實現方式。


1. Topic 模式的工作原理

1.1 Topic 模式概述

在 RabbitMQ 中,Topic 模式是基于 交換機類型為 topic 的一種消息傳遞模式。與 Direct 模式(精確匹配)和 Fanout 模式(廣播)不同,Topic 模式允許生產者發送消息到特定的交換機,并根據消息的 路由鍵(Routing Key)綁定鍵(Binding Key) 的匹配規則,將消息分發到相應的隊列。

在這里插入圖片描述

1.2 關鍵概念

1.2.1 交換機(Exchange)

在 Topic 模式中,消息不會直接發送到隊列,而是發送到一個 topic 類型的交換機。交換機根據消息的路由鍵和隊列的綁定鍵進行匹配,決定將消息分發到哪些隊列。

1.2.2 路由鍵(Routing Key)

路由鍵是生產者在發送消息時指定的字符串,用于描述消息的主題或類別。路由鍵通常由多個單詞組成,單詞之間用點號(.)分隔,例如:user.logs.info

1.2.3 綁定鍵(Binding Key)

綁定鍵是消費者在綁定隊列到交換機時指定的字符串,用于描述隊列感興趣的主題或類別。綁定鍵的格式與路由鍵相同,但支持通配符匹配。

1.2.4 通配符

Topic 模式支持兩種通配符:

  • *(星號):匹配一個單詞。
  • #(井號):匹配零個或多個單詞。

例如:

  • *.logs.*:匹配所有包含 logs 的消息,如 user.logs.infosystem.logs.error
  • #.error:匹配所有以 error 結尾的消息,如 system.logs.erroruser.error

1.3 消息分發流程

  1. 生產者發送消息到 topic 類型的交換機,并指定路由鍵。
  2. 交換機根據路由鍵和隊列的綁定鍵進行匹配。
  3. 如果匹配成功,消息會被分發到相應的隊列。
  4. 消費者從隊列中消費消息。

2. Topic 模式的 Java 代碼實現

下面通過一個簡單的 Java 代碼示例,展示如何在 RabbitMQ 中實現 Topic 模式。

2.1 環境準備

在開始之前,請確保已經安裝并運行了 RabbitMQ 服務,并且安裝了 RabbitMQ 的 Java 客戶端庫。可以通過 Maven 引入依賴:

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version>
</dependency>

2.2 生產者代碼

生產者負責發送消息到 topic 交換機,并指定路由鍵。

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class TopicProducer {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws Exception {// 創建連接工廠ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");// 創建連接和通道try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 聲明一個 topic 類型的交換機channel.exchangeDeclare(EXCHANGE_NAME, "topic");// 定義路由鍵和消息內容String routingKey = "user.logs.info"; // 可以修改為其他路由鍵String message = "This is a log message from user.";// 發送消息到交換機channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + routingKey + "': '" + message + "'");}}
}

2.3 消費者代碼

消費者負責從隊列中接收消息,并根據綁定鍵過濾感興趣的消息。

import com.rabbitmq.client.*;public class TopicConsumer {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws Exception {// 創建連接工廠ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");// 創建連接和通道Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 聲明一個 topic 類型的交換機channel.exchangeDeclare(EXCHANGE_NAME, "topic");// 創建一個臨時隊列,并綁定到交換機String queueName = channel.queueDeclare().getQueue();String bindingKey = "user.#"; // 可以修改為其他綁定鍵channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");// 創建消費者并開始消費消息DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + delivery.getEnvelope().getRoutingKey() + "': '" + message + "'");};channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });}
}

3. 運行示例

3.1 啟動 RabbitMQ 服務

確保 RabbitMQ 服務已經啟動并運行。如果使用 Docker,可以通過以下命令啟動 RabbitMQ:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

3.2 運行生產者和消費者

  1. 運行 TopicProducer 類,發送消息到交換機。
  2. 運行 TopicConsumer 類,接收并處理消息。

3.3 測試不同的路由鍵和綁定鍵

  • 修改生產者的 routingKey,例如:system.logs.error
  • 修改消費者的 bindingKey,例如:#.error*.logs.*

觀察消息的分發情況,驗證 Topic 模式的通配符匹配功能。

在這里插入圖片描述


4. 總結

RabbitMQ 的 Topic 模式通過通配符匹配的方式,提供了靈活的消息分發機制,適用于復雜的場景。通過本文的介紹和代碼示例,讀者可以深入理解 Topic 模式的工作原理,并掌握如何在 Java 中實現 Topic 模式。

在實際應用中,Topic 模式可以用于日志收集、事件驅動架構等場景,幫助開發者構建高效、可擴展的分布式系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63801.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

可編輯99PPT | 智能工廠整體規劃方案及實施細部方案

薦言分享&#xff1a;智能工廠是利用物聯網、大數據、人工智能等先進技術&#xff0c;實現生產過程自動化、智能化和柔性化的現代工廠。本整體規劃方案旨在通過整合信息技術、自動化技術、人工智能技術和物聯網技術&#xff0c;構建一個高效、靈活、綠色、可持續的生產環境&…

Day13 用Excel表體驗梯度下降法

Day13 用Excel表體驗梯度下降法 用所學公式創建Excel表 用Excel表體驗梯度下降法 詳見本Day文章頂部附帶資源里的Excel表《梯度下降法》&#xff0c;可以對照表里的單元格公式進行理解&#xff0c;還可以多嘗試幾次不同的學習率 η \eta η來感受&#xff0c;只需要更改學習率…

YOLOv8改進,YOLOv8引入Hyper-YOLO的MANet混合聚合網絡+HyperC2Net網絡

摘要 理論介紹 MANet 的目標是通過多種卷積操作的協同作用,提高特征提取能力,并加強梯度流動,從而提升模型在不同層次的特征表示和語義深度。MANet 結合了三種卷積變體,通過混合使用它們來提高視覺特征的多樣性和信息流動性。 HyperC2Net 的主要目標是通過超圖結構對多層次…

Nautilus源碼編譯傻瓜式教程二

Nautilus源碼編譯傻瓜式教程一 Nautilus編譯 依賴項文件 接上文,點擊小錘子進行編譯后出現如下的錯誤提示 看這個報錯,未找到文件或目錄,再看前面的git地址是github就知道肯定是下載有問題,查找下Nautilus項目,發現在nautilus/build-aux/flatpak/org.gnome.Nautilus.json文件…

Java中使用四葉天動態代理IP構建ip代理池,實現httpClient和Jsoup代理ip爬蟲

在本次爬蟲項目中&#xff0c;關于應用IP代理池方面&#xff0c;具體完成以下功能&#xff1a; 從指定API地址提取IP到ip池中&#xff08;一次提取的IP數量可以自定義更改&#xff09; 每次開始爬蟲前&#xff08;多條爬蟲線程并發執行&#xff09;&#xff0c;從ip池中獲取一…

CEF127 編譯指南 MacOS 篇 - 拉取 CEF 源碼(五)

1. 引言 在完成了所有必要工具的安裝和配置后&#xff0c;我們進入到獲取 CEF 源碼的階段。對于 macOS 平臺&#xff0c;CEF 的源碼獲取過程需要特別注意不同芯片架構&#xff08;Intel 和 Apple Silicon&#xff09;的區別以及版本管理。本文將詳細介紹如何在 macOS 系統上獲…

梳理你的思路(從OOP到架構設計)_設計模式Factory Method模式

目錄 1、Factory Method模式 2、范例&#xff1a; Android FM(工廠)模式 3、Android里處處可見的FM模式的應用 1、Factory Method模式 誰來創建<T>的對象呢?例如&#xff0c; 剛才的Template Method模式內含一個EIT造形&#xff0c;那麼&#xff0c; 請問&#xff…

tauri桌面應用開發入門

簡介 tauri是一款基于web的桌面應用前端框架 因為使用webviews渲染,而不是像electron自帶一個瀏覽器內核,所以打包之后的空間更小,十幾mb 前端界面使用web,可以采取流行的框架,入react,vue等 前端后臺采用rust,彌補前端無法直接訪問操作系統,常用于訪問本地文件系統 官方中…

selenium 報錯 invalid argument: invalid locator

環境&#xff1a; Python3.12.2 selenium4.0 報錯信息&#xff1a; invalid argument: invalid locator 錯誤分析&#xff1a; selenium語法錯誤,find_element方法少寫By.XPATH參數 錯誤語法如下&#xff1a; driver.find_element(//div[id"myid"]) 解決辦…

ESP8266 WiFi模塊入門:搭建網絡與測試實踐

在物聯網&#xff08;IoT&#xff09;應用中&#xff0c;設備聯網是核心功能之一。而ESP8266串口WiFi ESP-01模塊是一款低成本、功能強大的UART-WiFi透傳模塊&#xff0c;廣泛應用于智能家居、工業控制等領域。本篇文章將從基礎出發&#xff0c;講解如何使用ESP8266模塊進行WiF…

框架問題學習

1、gin 1.1、gin框架路由是怎么處理的 在 Gin 中&#xff0c;路由是通過 gin.Default() 或 gin.New() 創建的 *gin.Engine 對象來管理的。gin.Default() 是 gin.New() 的一個封裝&#xff0c;它在創建路由對象時會自動添加一個默認的中間件&#xff08;如日志記錄、恢復中間件…

Java模擬Mqtt客戶端連接Mqtt Broker

Java模擬Mqtt客戶端基本流程 引入Paho MQTT客戶端庫 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>設置mqtt配置數據 …

電子電氣架構 --- 隊列刷寫場景及刷寫上位機淺析

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 所謂雞湯,要么蠱惑你認命,要么慫恿你拼命,但都是回避問題的根源,以現象替代邏輯,以情緒代替思考,把消極接受現實的懦弱,偽裝成樂觀面對不幸的…

springboot根據租戶id動態指定數據源

代碼地址 碼云地址springboot根據租戶id動態指定數據源: springboot根據租戶id指定動態數據源,結合mybatismysql多數源下的事務管理 創建3個數據庫和對應的表 sql腳本在下圖位置 代碼的執行順序 先設置主數據庫的數據源配置目標數據源和默認數據源有了主庫的數據源&#xff…

C++簡明教程(文章要求學過一點C語言)(3)

一、編程工具大揭秘——IDE 當我們準備踏入 C 編程的奇妙世界時&#xff0c;首先要認識一個重要的“魔法盒子”——集成開發環境&#xff08;IDE&#xff09;。IDE 就像是一個全能的編程工作室&#xff0c;它把我們寫代碼所需要的各種工具都整合到了一起&#xff0c;讓編程這件…

達夢官方工具 SQLark數據遷移(oracle->達夢數據庫)

應國產化需求需要,需將系統中涉及的各中間件替換成國產中間件,此文介紹了從Oracle遷移數據至達夢dm8的步驟,該文在windos環境下已驗證測試過 1 SQLark介紹 SQLark是一款專為信創應用開發者設計的數據庫開發和管理工具。它支持快速查詢、創建和管理多種類型的數據庫系統&#xf…

【JAVA】JAVA接口公共返回體ResponseData封裝

一、JAVA接口公共返回體ResponseData封裝&#xff0c;使用泛型的經典 例子 public class ResponseData<T> implements Serializable { /** * */ private static final long serialVersionUID 7098362967623367826L; /** * 響應狀態碼 */ …

AlipayHK支付寶HK接入-商戶收款(PHP)

一打開支付寶國際版 二、點開商戶服務 三、下載源碼

【Prompt Engineering】6 文本擴展

一、引言 文本擴展&#xff1a;將短文本輸入到大型語言模型中&#xff0c;生成更長的文本。應用場景&#xff1a;頭腦風暴、生成電子郵件或論文等。風險&#xff1a;可能被用于生成垃圾郵件。使用原則&#xff1a;負責任地使用&#xff0c;確保有益于人們。技術準備&#xff1…

nginx學習總結(不包含安裝過程)

1. nginx常見配置 http服務上支持【若干虛擬主機】。每個虛擬主機對應一個server配置項&#xff0c;配置項里面包含該虛擬主機相關的配置。 server{listen 80 default;server_name www.yonqin.com;index index.html index.htm index.php;root /data/www;location ~ .*\.(gif|…