Rabbitmq Direct Exchange(直連交換機)可以保證消費不被重復消費嗎,可以多個消費者,但是需要保證同一個消息,不會被投遞給多個消費者

在 RabbitMQ 中,默認情況下,不能保證消息不被重復消費,但可以通過?隊列綁定方式 + 消費者競爭機制?來確保?同一消息只被一個消費者處理。以下是幾種可行的方案:


方案 1:單隊列 + 競爭消費者模式(默認行為)

原理

  • 多個消費者訂閱同一個隊列,RabbitMQ 會以?輪詢(Round-Robin)?方式分發消息。

  • 天然保證同一消息只被一個消費者消費(因為隊列里的消息被取出后就不再存在)。

代碼示例

python

# 生產者發送消息到隊列
channel.basic_publish(exchange="",routing_key="single_queue",  # 直連隊列(不經過 Exchange)body="message1"
)# 消費者1和消費者2競爭消費同一個隊列
channel.basic_consume(queue="single_queue", on_message_callback=consumer1)
channel.basic_consume(queue="single_queue", on_message_callback=consumer2)

??結果

  • message1?只會被?consumer1??consumer2?中的一個消費,不會重復。

適用場景

  • 需要?多個消費者并行處理不同消息,但?同一消息只需處理一次

  • 注意:如果消費者處理失敗并?requeue,消息可能被重新投遞(需額外處理,見方案3)。


方案 2:單活躍消費者(Single Active Consumer)

原理

  • RabbitMQ 3.8+ 支持?單活躍消費者模式,同一隊列同一時間只有一個消費者能接收消息。

  • 其他消費者處于備份狀態,主消費者斷開后自動切換。

配置方式

python

channel.queue_declare(queue="sac_queue",arguments={"x-single-active-consumer": True}  # 啟用單活躍消費者
)

??結果

  • 即使多個消費者訂閱?sac_queue,也?只有1個消費者能獲取消息

適用場景

  • 需要?嚴格串行處理消息(如訂單狀態機變更)。

  • 缺點:無法利用多消費者并行提升吞吐量。


方案 3:業務冪等性(最佳實踐)

原理

  • 允許消息被多次投遞,但業務邏輯保證?重復消費不影響結果

  • 實現方式:

    • 數據庫唯一約束(如?order_id?防重復)。

    • 樂觀鎖(更新前檢查?version?字段)。

    • Redis 記錄已處理消息ID(如?SET message_id 1 EX 3600)。

代碼示例

python

def process_order(message):order_id = message.body.order_idif redis.get(f"processed:{order_id}"):  # 檢查是否已處理return# 處理業務邏輯...redis.set(f"processed:{order_id}", "1", ex=3600)  # 標記已處理

??優點

  • 高可用,可擴展多個消費者。

  • 兼容 RabbitMQ 默認的輪詢分發機制。

適用場景

  • 高并發場景(如支付回調、庫存扣減)。


方案 4:分布式鎖(嚴格一致性)

原理

  • 消費者處理消息前,先獲取?分布式鎖(Redis / ZooKeeper)。

  • 確保同一時間只有一個消費者能處理消息。

代碼示例

python

def callback(message):lock_key = f"lock:{message.body.order_id}"if redis.set(lock_key, "1", nx=True, ex=10):  # 嘗試加鎖try:process_message(message)finally:redis.delete(lock_key)  # 釋放鎖else:channel.reject(message.delivery_tag, requeue=True)  # 重新入隊

??結果

  • 同一?order_id?的消息?只會被一個消費者處理

適用場景

  • 嚴格避免重復消費(如金融交易)。


對比總結

方案是否嚴格唯一消費擴展性實現復雜度適用場景
單隊列+競爭消費者? 是★★★默認場景,需防止?requeue
單活躍消費者? 是★★嚴格串行處理
業務冪等性? 否(業務防重)★★★★★★高并發系統(推薦)
分布式鎖? 是★★★★★★金融級嚴格一致性

最終建議

  1. 優先使用業務冪等性(方案3),兼容高并發和故障恢復。

  2. 如果需要嚴格單消費者:

    • 低吞吐場景 →?單活躍消費者(方案2)。

    • 高吞吐場景 →?分布式鎖(方案4)。

  3. 不要依賴 Direct Exchange 的?routing_key?來防重復,它只影響消息進入哪個隊列,不影響隊列內消息的分發方式。


🚀?關鍵結論
RabbitMQ 的?隊列(Queue)?是保證消息只被一個消費者消費的關鍵,而不是 Exchange 類型。正確綁定隊列和消費者,配合業務冪等或鎖機制,即可避免重復消費。

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

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

相關文章

常用的OTP語音芯片有哪些?

唯創知音在 OTP 語音芯片有著26年的歷史,有著豐富的技術積累與產品迭代歷程。1999 年,唯創知音在廣州成立,彼時便開始在電子領域積極探索。2000 年,公司敏銳捕捉到語音芯片行業的發展潛力,正式進軍該領域。經過數年技術…

分布式光伏發電系統中的“四可”指的是什么?

在分布式光伏電站規模爆發式增長的今天,“看不見、管不住、調不動”的難題卻成為行業痛點。如何讓散布各處的光伏電站真正成為穩定高效的“綠色能量站”?2025年《分布式光伏發電開發建設管理辦法》大型工商業項目(≥6MW)明確要求具…

健康管理系統新趨勢:AI + 物聯網如何重塑健康管理

一、傳統健康管理的痛點與變革之必然長久以來,我們熟悉的健康管理方式存在明顯局限:數據孤島嚴重:體檢報告在抽屜里沉睡,健身手環數據僅存于手機,不同醫療機構信息互不相通,個人健康信息猶如碎片散落各處。…

git基本操作【GIT-2】

git基本操作初始化一個倉庫(repository)、開始或停止跟蹤(track)文件、暫存(stage)或提交(commit)更改如何配置 Git 來忽略指定的文件和文件模式、如何迅速而簡單地撤銷錯誤操作、如…

【數據準備】——深度學習.全連接神經網絡

目錄 1 數據加載器 1.1 構建數據類 1.1.1 Dataset類 1.1.2 TensorDataset類 1.2 數據加載器 2 數據加載案例 2.1 加載csv數據集 2.2 加載圖片數據集 2.3 加載官方數據集 2.4 pytorch實現線性回歸 1 數據加載器 分數據集和加載器2個步驟~ 1.1 構建數據類 1.1.1 Dat…

健康生活,從細節開始

健康生活,從細節開始在當今快節奏的生活中,健康逐漸成為人們關注的焦點。擁有健康的身體,才能更好地享受生活、追求夢想。那么,如何才能擁有健康呢?這就需要我們從生活中的點滴細節入手,培養良好的生活習慣…

javax.servlet.http.HttpServletResponse;API導入報錯解決方案

javax.servlet.http.HttpServletResponse;API導入報錯解決方案與Postman上傳下載文件驗證 1. 主要錯誤:缺少 Servlet API 依賴 錯誤信息顯示 javax.servlet.http 包不存在。這是因為你的項目缺少 Servlet API 依賴。 解決方案: 如果你使用的是 Maven&…

reids依賴刪除,但springboot仍然需要redis參數才能啟動

背景:項目需要刪除redis。我刪除完項目所有配置redis的依賴,啟動報錯。[2025-07-17 15:08:37:561] [DEBUG] [restartedMain] DEBUG _.s.w.s.H.Mappings - [detectHandlerMethods,295] [] - o.s.b.a.w.s.e.BasicErrorController:{ [/error]}: error(HttpS…

【前端】CSS類命名規范指南

在 CSS 中,合理且規范的 class 命名格式對項目的可維護性和協作效率至關重要。以下是主流的 class 命名規范和方法論:一、核心命名原則語義化命名:描述功能而非樣式 ? .search-form(描述功能)? .red-text&#xff08…

C++網絡編程 4.UDP套接字(socket)編程示例程序

以下是基于UDP協議的完整客戶端和服務器代碼。UDP與TCP的核心區別在于無連接特性&#xff0c;因此代碼結構會更簡單&#xff08;無需監聽和接受連接&#xff09;。 UDP服務器代碼&#xff08;udp_server.cpp&#xff09; #include <iostream> #include <sys/socket.h&…

King’s LIMS:實驗室數字化轉型的智能高效之選

實驗室數字化轉型不僅是技術升級&#xff0c;更是管理理念和工作方式的革新。LIMS系統作為這一轉型的核心工具&#xff0c;能夠將分散的實驗數據轉化為可分析、可復用的資產&#xff0c;為科研決策提供支持&#xff1b;規范檢測流程&#xff0c;減少人為干預&#xff0c;確保結…

【力扣 中等 C】97. 交錯字符串

目錄 題目 解法一 題目 待添加 解法一 bool isInterleave(char* s1, char* s2, char* s3) {const int len1 strlen(s1);const int len2 strlen(s2);const int len3 strlen(s3);if (len1 len2 ! len3) {return false;}if (len1 < len2) {return isInterleave(s2, s1,…

Class9簡潔實現

Class9簡潔實現 %matplotlib inline import torch from torch import nn from d2l import torch as d2l# 初始化訓練樣本、測試樣本、樣本特征維度和批量大小 n_train,n_test,num_inputs,batch_size 20,100,200,5 # 設置真實權重和偏置 true_w,true_b torch.ones((num_inputs…

ELK日志分析,涉及logstash、elasticsearch、kibana等多方面應用,必看!

目錄 ELK日志分析 1、下載lrzsc 2、下載源包 3、解壓文件,下載elasticsearch、kibana、 logstash 4、配置elasticsearch 5、配種域名解析 6、配置kibana 7、配置logstash 8、進行測試 ELK日志分析 1、下載lrzsc [rootlocalhost ~]# hostnamectl set-hostname elk ##…

終極剖析HashMap:數據結構、哈希沖突與解決方案全解

文章目錄 引言 一、HashMap底層數據結構&#xff1a;三維存儲架構 1. 核心存儲層&#xff08;硬件優化設計&#xff09; 2. 內存布局對比 二、哈希沖突的本質與數學原理 1. 沖突產生的必然性 2. 沖突概率公式 三、哈希沖突解決方案全景圖 1. 鏈地址法&#xff08;Hash…

1.1.5 模塊與包——AI教你學Django

1.1.5 模塊與包&#xff08;Django 基礎學習細節&#xff09; 模塊和包是 Python 項目組織和代碼復用的基礎。Django 項目本質上就是由多個模塊和包組成。理解和靈活運用模塊與包機制&#xff0c;是寫好大型項目的關鍵。 一、import、from-import、as 的用法 1. import 用于導入…

UE5 相機后處理材質與動態參數修改

一、完整實現流程1. 創建后處理材質材質設置&#xff1a;在材質編輯器中&#xff0c;將材質域(Material Domain)設為后處理(Post Process)設置混合位置(Blendable Location)&#xff08;如After Tonemapping&#xff09;創建標量/向量參數&#xff08;如Intensity, ColorTint&a…

Django基礎(三)———模板

前言 在之前的文章中&#xff0c;視圖函數只是直接返回文本&#xff0c;而在實際生產環境中其實很少這樣用&#xff0c;因為實際的頁面大多是帶有樣式的HTML代碼&#xff0c;這可以讓瀏覽器渲染出非常漂亮的頁面。目前市面上有非常多的模板系統&#xff0c;其中最知名最好用的…

mysql6表清理跟回收空間

mysql6表清理跟回收空間 文章目錄mysql6表清理跟回收空間1.清理表2.備份表或者備份庫3.回收表空間4.查看5.驗證業務1.清理表 ## 登錄 C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -p Enter password: ****** Welcome to the MySQL monitor. Commands end w…

Java-74 深入淺出 RPC Dubbo Admin可視化管理 安裝使用 源碼編譯、Docker啟動

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-30-新發布【1T 萬億】參數量大模型&#xff01;K…