【RabbitMQ業務冪等設計】RabbitMQ消息是冪等的嗎?

在分布式系統中,RabbitMQ 自身不直接提供消息冪等性保障機制,但可通過業務邏輯設計和技術組合實現消息處理的冪等性。以下是 8 種核心實現方案及最佳實踐:


一、消息唯一標識符 (Message Deduplication)

  1. 原理

    • 每條消息攜帶全局唯一ID(如 UUID、Snowflake ID)
    • 消費者維護已處理消息ID的存儲(Redis/DB)
  2. 實現步驟

    // 生產者端
    MessageProperties props = new MessageProperties();
    props.setMessageId(UUID.randomUUID().toString());
    Message message = new Message(body.getBytes(), props);// 消費者端
    @RabbitListener(queues = "order_queue")
    public void process(Message message) {String msgId = message.getMessageProperties().getMessageId();if (redis.setnx(msgId, "processed") == 1) {// 處理業務邏輯// 成功后設置過期時間防止存儲膨脹redis.expire(msgId, 72 * 3600); } else {// 冪等攔截}
    }
    

二、版本號控制 (Optimistic Concurrency Control)

  1. 適用場景
    數據更新類操作(如賬戶余額修改)

  2. 實現方案

    -- 消息體包含數據版本號
    UPDATE account 
    SET balance = new_balance, version = version + 1 
    WHERE id = 123 AND version = current_version;
    

三、狀態機驅動 (State Machine)

  1. 應用場景
    訂單狀態流轉(創建→支付→發貨)

  2. 實現示例

    public void handleOrderMessage(OrderMessage msg) {Order order = orderDao.get(msg.getOrderId());if (order.getStatus() != msg.getExpectedStatus()) {log.warn("狀態不匹配,當前狀態:{}", order.getStatus());return;}// 執行狀態變更邏輯
    }
    

四、業務唯一鍵約束

  1. 實現方式
    CREATE TABLE payment_records (id BIGINT PRIMARY KEY,order_no VARCHAR(64) UNIQUE, -- 業務唯一鍵amount DECIMAL(10,2)
    );-- 插入時捕獲唯一鍵沖突
    try {insertPaymentRecord();
    } catch (DuplicateKeyException e) {// 冪等處理
    }
    

五、消息確認策略優化

  1. 關鍵配置

    spring:rabbitmq:listener:simple:acknowledge-mode: manual  # 手動ACKretry:enabled: truemax-attempts: 3         # 最大重試次數
    
  2. 處理邏輯

    @RabbitListener(queues = "critical_queue")
    public void process(Message message, Channel channel) throws IOException {try {// 業務處理channel.basicAck(tag, false);} catch (Exception e) {channel.basicNack(tag, false, false); // 直接進入死信隊列}
    }
    

六、分布式鎖機制

  1. Redis 分布式鎖示例
    public void processWithLock(Message msg) {String lockKey = "msg_lock:" + msg.getId();try {if (redisLock.tryLock(lockKey, 30)) {// 真正的業務處理}} finally {redisLock.unlock(lockKey);}
    }
    

七、時序控制 (Timestamp Validation)

  1. 實現邏輯
    if (message.getEventTime() < lastProcessedTime.get()) {log.info("丟棄過期消息,事件時間:{}", message.getEventTime());return;
    }
    

八、消息軌跡追蹤表

  1. 設計表結構

    CREATE TABLE message_log (message_id VARCHAR(64) PRIMARY KEY,status ENUM('PROCESSING','SUCCESS','FAILED'),processed_time DATETIME,retry_count INT DEFAULT 0
    );
    
  2. 處理流程

    // 開啟事務
    beginTransaction();
    try {// 1. 插入消息記錄insertMessageLog(msgId, "PROCESSING");// 2. 執行業務操作processBusinessLogic();// 3. 更新狀態updateMessageStatus(msgId, "SUCCESS");commit();
    } catch (Exception e) {rollback();
    }
    

最佳實踐組合建議

  1. 金融交易場景
    唯一ID + 版本號控制 + 數據庫唯一約束 + 分布式鎖

  2. 電商訂單場景
    狀態機 + 業務唯一鍵 + 消息軌跡表

  3. 日志處理場景
    時序驗證 + Redis去重 + 自動重試策略


注意事項

  1. 存儲選擇權衡

    • Redis: 高性能但存在數據丟失風險
    • 數據庫: 可靠性高但性能較低
    • 建議:關鍵業務使用DB+緩存雙寫
  2. 清理策略

    • 設置合理的TTL(例如72小時)
    • 定時任務清理已處理記錄
  3. 性能優化

    • 使用Bloom Filter減少內存消耗
    • 批量查詢優化(如一次查詢1000個ID是否存在)

通過以上方案組合,可在不同業務場景中實現可靠的冪等處理,建議根據實際業務壓力和數據一致性要求選擇合適的實現層級。

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

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

相關文章

網絡可靠性要求

目錄 一、背景介紹 二、環路引發的危害 1、廣播風暴 2、MAC 地址表震蕩 三、STP生成樹 1、STP的作用 2、STP工作過程 3、根橋選舉 4、根端口選舉 5、指定端口選舉 6、BPDU報文分析 7、計時器 8、端口狀態轉化 總結 一、背景介紹 為了提高網絡可靠性&#xff0c;交換網絡…

《STL 六大組件之容器探秘:深入剖析 string》

目錄 一、string 類簡介二、string 類的常用接口1. 構造函數&#xff08;constructor function&#xff09;2. 與容量相關的接口&#xff08;capacity&#xff09;3. 與迭代器有關的接口&#xff08;iterator&#xff09;4. 與元素訪問有關的接口&#xff08;element access&am…

Unreal5從入門到精通之在編輯器中更新 UserWidgets

前言 在虛幻中創建越來越復雜和靈活的 UserWidget 藍圖時,一個問題是它們在編輯器中的外觀與它們在游戲中的最終外觀可能有很大不同。 庫存面板示例 假設你想創建一個通用的庫存顯示小部件。我們可以在整個 UI 中使用它,無論我們需要在哪里顯示某些內容。 標題,描述所顯示…

計算機網絡-OSI七層參考模型與數據封裝,網絡安全零基礎入門到精通實戰教程!

目錄 一、網絡 1、網絡的定義 2、網絡的分類 3、網絡的作用 4、網絡的數據傳輸方式 5、網絡的數據通訊方式 二、OSI七層參考模型 1、網絡參考模型定義 2、分層的意義 3、分層與功能 4、TCP\IP五層模型 三、參考模型的協議 1、物理層 2、數據鏈路層 3、網絡層 4…

Python正則替換終極指南:用re.sub玩轉字符串魔法

Python正則替換終極指南&#xff1a;用re.sub玩轉字符串魔法 一、為什么re.sub是文本處理的瑞士軍刀&#xff1f; 在Python的re模塊中&#xff0c;re.sub()的周下載量突破5800萬次&#xff08;2025年PyPI數據&#xff09;&#xff0c;它實現了&#xff1a; &#x1f4cd; 模…

gen_gauss_filter用于檢測帶方向的線條

目錄 一、核心參數分析 1.1 方向覆蓋范圍 1.2 濾波器方向帶寬 二、角度配置建議 三、參數選擇依據 四、實施建議 五、模擬圖測試(項目圖檔不好直接分享) 5.1 模擬圖制作 5.2 檢測偽代碼 在Halcon中使用高斯濾波器檢測多方向線條時,角度參數的選取需要綜合考慮濾波…

C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串轉換工具

文章目錄 1. 傳統轉換方法的局限性2. std::to_chars&#xff1a;數值到字符串的高效轉換函數原型&#xff1a;返回值&#xff1a;示例代碼&#xff1a;輸出&#xff1a; 3. std::from_chars&#xff1a;字符串到數值的高效解析函數原型&#xff1a;返回值&#xff1a;示例代碼&…

深入學習解析:183頁可編輯PPT華為市場營銷MPR+LTC流程規劃方案

華為終端正面臨銷售模式轉型的關鍵時刻&#xff0c;旨在通過構建MPRLTC項目&#xff0c;以規避對運營商定制的過度依賴&#xff0c;并探索新的增長路徑。項目核心在于建設一套全新的銷售流程與IT系統&#xff0c;支撐雙品牌及自有品牌的戰略發展。 項目總體方案聚焦于四大關鍵議…

Python正則表達式處理中日韓字符過濾全解析

Python正則表達式處理中日韓字符過濾全解析 一、核心原理&#xff1a;Unicode字符范圍定位 中日韓字符在Unicode中的分布&#xff1a; 中文&#xff1a;\u4e00-\u9fff&#xff08;基本區&#xff09; \u3400-\u4dbf&#xff08;擴展A區&#xff09; \U00020000-\U0002a6df…

基于WOA鯨魚優化的WSN網絡最優節點部署算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 鯨魚優化算法&#xff08;WOA&#xff09;是一種模擬座頭鯨捕食行為的元啟發式優化算法。其主要原理基于座頭鯨獨特的 “氣泡網” 捕食策略&#xff0c;通過數學模…

【數據分析】3 數據分析成長之路

職業發展路徑&#xff1a; 向上發展&#xff08;技術方向&#xff09;&#xff1a;可以詳細說明成為數據科學家或專家所需的具體技能和步驟&#xff0c;包括學習的算法、工具等。向下發展&#xff08;業務方向&#xff09;&#xff1a;可以探討結合業務知識的具體領域&#xff…

excel導入Mysql中時間格式異常

問題描述&#xff1a; 當使用xls/xlsx/csv導入mysql中&#xff0c;如果列是時間類型比如excel表中顯示2024/02/20 09:18:00&#xff0c;導入后時間可能就會變成1900-01-01 09:18:00這樣。 問題原因&#xff1a; 這是由于excel表中和數據庫中的時間類型不匹配導致。 問題解決…

async checkpointing

Reducing Model Checkpointing Times by Over 10x with PyTorch Distributed Asynchronous Checkpointing | PyTorch 最初來源&#xff1a;IBM Research 核心思想&#xff1a;GPU->CPU&#xff0c;用的是blocking&#xff1b;CPU->Disk&#xff0c;用的是異步不阻塞訓練…

Nginx穩定版最新1.26.2源碼包安裝【保姆級教學】

Nginx安裝及配置 開源Nginx官網地址(https://nginx.org) Nginx源碼包下載地址(https://nginx.org/en/download.html) Mainline version 主線版本 Stable version 穩定版本 Legacy versions 陳舊版本 下載Nginx源碼文件 curl -O https://nginx.org/download/nginx-1.26.2.t…

在ubuntu上用Python的openpyxl模塊操作Excel的案例

文章目錄 安裝模塊讀取Excel數據庫取數匹配數據和更新Excel數據 在Ubuntu系統的環境下基本職能借助Python的openpyxl模塊實現對Excel數據的操作。 安裝模塊 本次需要用到的模塊需要提前安裝(如果沒有的話) pip3 install openpyxl pip3 install pymysql在操作前&#xff0c;需…

GeoHD - 一種用于智慧城市熱點探測的Python工具箱

GeoHD - 一種用于智慧城市熱點探測的Python工具箱 詳細原理請參考&#xff1a;Yan, Y., Quan, W., Wang, H., 2024. A data‐driven adaptive geospatial hotspot detection approach in smart cities. Trans. GIS tgis.13137. 代碼下載&#xff1a;下載 1. 簡介 在城市數據…

16 中介者(Mediator)模式

中介者模式 1.1 分類 &#xff08;對象&#xff09;行為型 1.2 提出問題 實現一個機場的起飛管理系統&#xff0c;如果由駕駛員們討論誰先飛&#xff0c;后果可能是災難性的。 1.3 解決方案 用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用&a…

最薄的機身,游最深的海

經濟全球化的潮流&#xff0c;勢不可擋。 “技術、通訊和全球化&#xff0c;正在消除傳統的地理和經濟邊界&#xff0c;使競爭環境趨于平等。”《世界是平的》作者托馬斯弗里德曼預言的"扁平化競爭"正加速演進。 在高端智能手機戰場&#xff0c;一場由中國企業主導…

【HarmonyOS Next】鴻蒙監聽手機按鍵

【HarmonyOS Next】鴻蒙監聽手機按鍵 一、前言 應用開發中我們會遇到監聽用戶實體按鍵&#xff0c;或者擴展按鍵的需求。亦或者是在某些場景下&#xff0c;禁止用戶按下某些按鍵的業務需求。 這兩種需求&#xff0c;鴻蒙都提供了對應的監聽事件進行處理。 onKeyEvent 默認的…

IC設計版圖中GDS2文件格式詳解

版圖中GDS2文件格式詳解 目錄 什么是GDS2文件&#xff1f;GDS2文件的歷史與發展GDS2文件的結構解析GDS2文件的核心元素GDS2 vs. OASIS: 核心差異如何生成與查看GDS2文件&#xff1f;GDS2文件的局限性應用場景總結 什么是GDS2文件&#xff1f; GDS2&#xff08;Graphic Data …