RabbitMQ使用topic Exchange實現微服務分組訂閱

????????案例場景:用戶下單后需要多個微服務(如營銷、會員)分別訂閱并處理訂單事件,且每個微服務可能有多個集群實例,需要保證同一個微服務的集群中,只有一個實例消費到消息。

????????不同于Kafka和rocketMQ有分組消費的功能,rabbitMQ需要通過topic Exchange實現。

? ? ? ? 1、消息設計

{"event_type": "order_created",  // 事件類型(如下單、支付成功)"order_id": "123456","user_id": "user_789","items": [{"product_id": "p1001", "quantity": 2},{"product_id": "p1002", "quantity": 1}],"total_amount": 399.00,"created_at": "2025-07-01T12:00:00Z"
}

? ? ? ? 2、rabbitMQ設計

????????使用 topic 類型的 Exchange:支持靈活的路由規則,不同微服務可通過 binding key 訂閱特定事件。
Exchange 名稱示例:order_events。

微服務	    隊列名	            綁定鍵(binding key)
營銷系統	    marketing_queue	    order.created.marketing
會員系統	    member_queue	    order.created.member綁定鍵規則:<event_type>.<microservice_name>,便于后續擴展(如 order.cancel.marketing)。

? ? ? ? 3、消息發布

????????生產者(訂單服務)發布消息時,指定路由鍵(routing key) 為 order.created

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.fasterxml.jackson.databind.ObjectMapper;public class OrderProducer {private static final String EXCHANGE_NAME = "order_events";private static final String ROUTING_KEY = "order.created";public static void main(String[] args) throws Exception {// 1. 創建連接ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("guest");factory.setPassword("guest");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 2. topic Exchangechannel.exchangeDeclare(EXCHANGE_NAME, "topic", true);// 3. 構造消息OrderEvent event = new OrderEvent();event.setEvent_type("order_created");event.setOrder_id("123456");event.setUser_id("user_789");event.setItems(List.of(Map.of("product_id", "p1001", "quantity", 2)));event.setTotal_amount(399.00);event.setCreated_at("2025-07-02T22:00:00Z");ObjectMapper mapper = new ObjectMapper();String messageJson = mapper.writeValueAsString(event);// 4. 發布消息channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,true, // 持久化消息new AMQP.BasicProperties.Builder().deliveryMode(2) // 持久化.build(),messageJson.getBytes());System.out.println("Sent order event: " + messageJson);}}
}

? ? ? ? 4、消息訂閱(營銷服務)

? ? ? ? 不同服務只需要修改?QUEUE_NAME 和 BINDING_KEY 就可以了。?

import com.rabbitmq.client.*;
import com.fasterxml.jackson.databind.ObjectMapper;public class MarketingConsumer {private static final String QUEUE_NAME = "marketing_queue";private static final String BINDING_KEY = "order.created.marketing";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("guest");factory.setPassword("guest");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 1. 聲明隊列并綁定到 Exchangechannel.queueDeclare(QUEUE_NAME, true, false, false, null);channel.queueBind(QUEUE_NAME, "order_events", BINDING_KEY);// 2. 消費者回調DeliverCallback deliverCallback = (consumerTag, delivery) -> {String messageJson = new String(delivery.getBody(), "UTF-8");ObjectMapper mapper = new ObjectMapper();OrderEvent event = mapper.readValue(messageJson, OrderEvent.class);// 3. 業務邏輯:發送營銷短信System.out.println("Marketing: Sending SMS for order " + event.getOrder_id());// 4. 手動確認消息channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);};// 5. 設置手動確認channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});}
}

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

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

相關文章

kotlin 通道trysend方法

trySend 方法是 Kotlin 協程中 Channel 類的一個重要功能。它用于向通道發送元素&#xff0c;但與 send 方法不同的是&#xff0c;trySend 是非阻塞的。這意味著它不會在通道滿時掛起當前協程&#xff0c;而是會立即返回。 trySend 方法的效果 非阻塞行為&#xff1a; 當你調用…

winform CheckedListBox單擊選中解決方案

在WinForms的CheckedListBox控件中&#xff0c;默認需要雙擊才能切換選中狀態&#xff08;復選框勾選&#xff09;。要實現單擊即選中&#xff0c;需要通過代碼處理鼠標點擊事件并手動切換選中狀態。以下是實現步驟&#xff1a; 1.CheckOnClick屬性置為true即可。 2.通過事件處…

Docker文件操作、數據卷、掛載

一&#xff1a;容器文件操作 在Docker環境中&#xff0c;管理容器內部的文件是一個常見的需求。 無論是為了配置應用、備份數據還是調試問題&#xff0c;了解如何高效地進行文件操作都是非常重要的。 docker cp命令提供了一種簡單的方法來在宿主主機和容器之間復制文件或目錄…

接口漏洞怎么抓?Fiddler 中文版 + Postman + Wireshark 實戰指南

接口安全是現代應用開發中的高危環節&#xff1a;一旦API存在未授權訪問、參數篡改、權限繞過等漏洞&#xff0c;可能直接導致用戶信息泄露、資金損失甚至整個平臺癱瘓。對于開發和安全人員來說&#xff0c;光依賴后端日志排查遠遠不夠&#xff0c;需要對接口進行主動安全性驗證…

iOS 出海 App 安全加固指南:無源碼環境下的 IPA 加固與防破解方法

隨著越來越多國內開發團隊將iOS App推向海外市場&#xff0c;如何在交付和分發環節保護應用安全成為出海過程中的重要議題。尤其是App進入多個海外應用商店或通過第三方渠道發行時&#xff0c;容易被當地黑產或競爭對手進行逆向分析&#xff0c;從而暴露內部API、核心業務流程等…

React Hooks 內部實現原理與函數組件更新機制

React Hooks 內部實現原理與函數組件更新機制 Hooks 的內部實現原理 React Hooks 的實現依賴于以下幾個關鍵機制&#xff1a; 1. 鏈表結構存儲 Hook 狀態 React 使用單向鏈表來管理 Hooks 的狀態。每個 Hook 節點包含&#xff1a; type Hook {memoizedState: any, // 存儲…

分布式會話的演進和最佳實踐,含springBoot 實現(Java版本)

一、分布式會話的背景 在微服務架構或集群部署環境下&#xff0c;請求可能落在不同的服務器節點&#xff0c;無法再依賴本地內存來維護用戶 Session。因此&#xff0c;需要一種跨節點共享 Session 的機制&#xff0c;這就是 分布式會話管理的核心目標。二、分布式會話的演進歷程…

ch03 部分題目思路

G. 收集 由于稀有度相同的物品需要一起處理&#xff0c;我們先把他們聚集到一起。 類似這樣&#xff1a; vector<int> g[maxn]; ... {cin >> x >> c;g[c].push_back(x); }那么我們需要一個貪心的思路&#xff1a; 肯定是按 ccc 從小往大收集的&#xff1b;對…

Django多表查詢(ORM)

1、建立表結構 三個表&#xff1a;book、Author、publisher。 書籍和作者是多對多的關系&#xff0c;一本書可以有多個作者&#xff0c;一個作者可以有多本書。 出版社和書籍是一對多的關系&#xff0c;一個出版社可以出版多本書&#xff08;多方&#xff0c;多方定義外鍵&…

C# 集合表達式和展開運算符 (..) 詳解

集合表達式 (Collection Expressions)基本語法支持的集合類型展開運算符 (..)基本用法實際應用示例創建新集合合并集合與現有API結合性能考慮高級用法多維集合自定義集合注意事項與傳統方式的比較總結集合表達式 (Collection Expressions) C# 12 引入了集合表達式&#xff0c;…

數學視頻動畫引擎Python庫 -- Manim Voiceover 安裝 Installation

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 Manim Voiceover 是一個為 Manim 打造的專注于語音旁白的插件&#xff1a; 直接在 Python 中添加語音旁白&#xff1a; 無需使用視頻編輯器&…

Git安裝避坑指南:新手村通關秘籍

Git安裝避坑指南&#xff1a;新手村通關秘籍 剛學編程那會兒&#xff0c;Git安裝差點讓我砸鍵盤。滿心歡喜打開官網下載&#xff0c;結果卡在配置上&#xff0c;命令行死活不認識git命令。看著教程里別人行云流水的操作&#xff0c;自己對著報錯信息干瞪眼——這感覺&#xff…

如何修改Siteground max_execution_time值?

這個值在Siteground 上是修改不了的。 以下是來自Siteground 官網的解釋&#xff1a; 由于服務器上全局定義的 PHP 限制&#xff0c;某些 PHP 設置無法更改。最常見的無法更改的 PHP 設置包括&#xff1a; memory_limit max_execution_time max_input_time post_max_size up…

【libm】 11 fmin函數 (fmin.rs)

一、源碼 這段代碼實現了一個符合 IEEE 754-2008 標準的 minNum 函數&#xff08;在 Rust 中命名為 fmin&#xff09;&#xff0c;該功能在 IEEE 754-2019 標準中已被 minimumNumber 取代。 /* SPDX-License-Identifier: MIT OR Apache-2.0 */ //! IEEE 754-2008 minNum. Thi…

React 英語單詞消消樂一款專為英語學習設計的互動式記憶游戲

&#x1f4d6; 項目簡介 英語單詞消消樂 是一款專為英語學習設計的互動式記憶游戲。通過經典的消消樂玩法&#xff0c;讓用戶在輕松愉快的游戲中掌握英語單詞&#xff0c;提高詞匯量和記憶效果。 &#x1f3af; 項目目標 讓英語學習變得有趣且高效通過游戲化方式增強單詞記憶…

Qt:QPushButton、QRadioButton、QCheckBox

目錄 一、QPushButton 1.認識QPushButton 2.設置按鈕圖標 3.設置按鈕的快捷鍵 二、QRadioButton 常用的信號 按鈕的分組 三、QCheckBox 一、QPushButton 1.認識QPushButton QPushButton繼承自QWidget&#xff0c;所以在上一篇文章中介紹的QWidget的屬性&#xff0c;理…

docker 無法拉取鏡像解決方法

目錄 我在omv中通過后臺頁面拉取alist鏡像總是失敗&#xff0c;原因千奇百怪 今天再戰終于解決首先&#xff0c;到dockerhub找鏡像和wiki進入docker賬號設置 找到里面提示了登錄操作和密碼命令行中執行后會提示成功之后按需配置代理&#xff0c;同時檢查自己的配置檢查 Docker …

安卓10.0系統修改定制化_____安卓9與安卓10系統文件差異 有關定制選項修改差異

在修改安卓10的rom之前。我們需要對rom有簡單的了解。區分安卓10與安卓9之間的差異。了解不同安卓版本之間系統文件的變化以及權限的區別。對于修改一些定制化選項有很大的輔助作用. 通過博文了解?????? 1??????-----安卓10與安卓9之間文件實例對比 了解差異 …

HTML表單元素全面指南:從基礎到實踐

引言 HTML表單是網頁開發中不可或缺的一部分&#xff0c;它為用戶提供了與網站交互的途徑。無論是簡單的登錄頁面還是復雜的數據提交界面&#xff0c;表單元素都扮演著關鍵角色。本文將詳細介紹各種HTML表單元素及其使用方法。 輸入框(input元素) input元素是最基礎也是最靈…

深度學習的核心理論與技術

理解深度學習的基本原理、核心算法和關鍵技術 深度學習的核心理論與技術前言一、深度學習核心理論1. 神經網絡基礎核心內容練習資源2. 反向傳播與梯度下降核心內容練習資源3. 卷積神經網絡&#xff08;CNN&#xff09;核心內容練習資源4. 循環神經網絡&#xff08;RNN&#xff…