Rabbitmq Direct Exchange(直連交換機)多個消費者,配置相同的key ,隊列,可以保證只有一個消費者消費嗎

思考

可以保證消費不被重復消費,因為通過輪詢一個消息只會投遞給一個消費者。

但是不是一個消費者消費,而是多個輪詢消費


在 RabbitMQ 中,如果多個消費者(Consumers)同時訂閱?同一個隊列(Queue),并且這個隊列是通過?Direct Exchange?綁定的(使用相同的?routing_key),那么默認情況下?不能保證只有一個消費者消費,而是會按照?輪詢(Round-Robin)?的方式分發給多個消費者。


1. 默認行為(多個消費者訂閱同一個隊列)

場景描述

  • Direct Exchange?綁定了?1 個隊列(Queue),并指定了?routing_key(如?payment.success)。

  • 多個消費者?同時訂閱這個隊列。

消息分發方式

??輪詢(Round-Robin)

  • RabbitMQ 會?依次?將消息分發給不同的消費者,不會保證唯一消費

  • 例如:

    • Consumer1?收到消息1、消息3、消息5...

    • Consumer2?收到消息2、消息4、消息6...

代碼示例

python

# 生產者發送消息到 Direct Exchange
channel.basic_publish(exchange="direct_exchange",routing_key="payment.success",  # 匹配綁定的隊列body="Order123 paid"
)# 多個消費者訂閱同一個隊列
channel.basic_consume(queue="payment_queue", on_message_callback=consumer1)
channel.basic_consume(queue="payment_queue", on_message_callback=consumer2)

結果:消息會被?consumer1?和?consumer2?輪流消費,而不是僅由一個消費者處理。


2. 如何確保只有一個消費者消費?

如果你希望?同一消息只被一個消費者處理,有以下幾種方案:

方案 1:單隊列 + 單消費者

  • 只啟動?1 個消費者,其他消費者不訂閱該隊列。

  • 缺點:無法擴展,吞吐量低。

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

  • RabbitMQ 3.8+ 支持?單活躍消費者?模式:

    python

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

    • 多個消費者可以注冊,但?只有第一個注冊的消費者能接收消息

    • 如果該消費者斷開,RabbitMQ 會自動切換到下一個消費者。

  • 優點

    • 無需額外組件(如 Redis 鎖)。

    • 自動故障轉移。

  • 缺點

    • 仍然不能并行處理消息。

方案 3:業務冪等性(推薦)

  • 允許消息被多個消費者消費,但業務邏輯保證?重復消費不影響結果(如數據庫唯一約束、樂觀鎖)。

  • 優點

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

  • 缺點

    • 業務邏輯需要支持冪等。

方案 4:分布式鎖(Redis / DB 鎖)

  • 消費者處理消息前先獲取鎖:

    python

    def callback(message):lock_key = f"lock:{message.body.order_id}"if redis.set(lock_key, "1", nx=True, ex=60):  # 加鎖process_payment(message)redis.delete(lock_key)  # 釋放鎖else:channel.reject(message.delivery_tag, requeue=True)  # 重新入隊
  • 優點

    • 嚴格保證唯一消費。

  • 缺點

    • 依賴外部存儲(Redis/DB)。

    • 鎖超時時間需合理設置。


3. 總結

方案適用場景是否嚴格唯一消費擴展性
單隊列 + 單消費者低吞吐場景? 是? 差
單活躍消費者(RabbitMQ 3.8+)需要自動故障轉移? 是? 差
業務冪等性高并發場景? 否(但業務層防重)? 好
分布式鎖嚴格一致性? 是?? 中等

推薦

  • 如果業務允許,優先采用?冪等性(方案 3)。

  • 如果需要嚴格單消費者,使用?單活躍消費者(方案 2)或?分布式鎖(方案 4)。


關鍵結論

🚨?Direct Exchange + 相同?routing_key?+ 相同隊列 + 多個消費者 = 消息輪詢分發(不保證唯一消費)
如果業務需要?嚴格單消費者,必須額外控制(如單活躍消費者或分布式鎖)

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

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

相關文章

設計模式是什么呢?

1.掌握設計模式的層次第一層:剛剛學編程不久,聽說過什么是設計模式。第二層:有很長時間的編程經驗,自己寫過很多代碼,其中用到了設計模式,但是自己不知道。第三層:學習過設計模式,發…

ThreadLocal使用詳解-從源碼層面分析

從demo入手看效果 代碼Demostatic ThreadLocal tl1 new ThreadLocal();static ThreadLocal tl2 new ThreadLocal();static ThreadLocal tl3 new ThreadLocal();public static void main(String[] args) {tl1.set("123");tl2.set("456");tl3.set("4…

CPO:對比偏好優化—突破大型語言模型在機器翻譯中的性能邊界

溫馨提示: 本篇文章已同步至"AI專題精講" CPO:對比偏好優化—突破大型語言模型在機器翻譯中的性能邊界 摘要 中等規模的大型語言模型(LLMs),如參數量為 7B 或 13B 的模型,在機器翻譯&#xff0…

執行shell 腳本 如何將日志全部輸出到文件

在執行 Shell 腳本時,如果需要將 所有輸出(包括標準輸出 stdout 和錯誤輸出 stderr) 重定向到日志文件,可以使用以下方法:方法 1:直接重定向(推薦) /appdata/mysql_backup_dump.sh &…

Postman接口測試實現UI自動化測試

Selenium底層原理 3天精通Postman接口測試,全套項目實戰教程!!運行代碼,啟動瀏覽器后,webdriver會將瀏覽器綁定到特定的端口,作為webdriver的remote server(遠程服務端),…

CSS動畫與變換全解析:從原理到性能優化的深度指南

引言:現代Web動畫的技術革命 在當今的Web體驗中,流暢的動畫效果已成為用戶交互的核心要素。根據Google的研究,60fps的動畫可以使用戶參與度提升53%,而卡頓的界面會導致跳出率增加40%。本文將深入剖析CSS動畫(animation…

NPM組件 @ivy-shared-components/iconslibrary 等竊取主機敏感信息

【高危】NPM組件 ivy-shared-components/iconslibrary 等竊取主機敏感信息 漏洞描述 當用戶安裝受影響版本的 ivy-shared-components/iconslibrary 等NPM組件包時會竊取用戶的主機名、用戶名、工作目錄、IP地址等信息并發送到攻擊者可控的服務器地址。 MPS編號MPS-zh19-e78w…

Fail2ban防止暴力破解工具使用教程

Fail2ban防止暴力破解工具使用教程場景Fail2ban安裝和配置安裝配置原理遇到的問題以及解決辦法問題1:設置的策略是10分鐘內ssh連接失敗2次的ip進行封禁,日志中實際卻出現4次連接。問題2:策略設置為1分鐘內失敗兩次,封禁ip。但通過…

亞遠景科技助力長城汽車,開啟智能研發新征程

亞遠景科技助力長城汽車,開啟智能研發新征程在汽車智能化飛速發展的當下,軟件研發管理成為車企決勝未來的關鍵。近日,亞遠景科技胡浩老師應邀為長城汽車開展了一場主題深刻且極具實用價值的培訓。本次培訓聚焦軟件研發管理導論 - 建立機器學習…

圖算法在前端的復雜交互

引言 圖算法是處理復雜關系和交互的強大工具,在前端開發中有著廣泛應用。從社交網絡的推薦系統到流程圖編輯器的路徑優化,再到權限依賴的拓撲排序,圖算法能夠高效解決數據之間的復雜關聯問題。隨著 Web 應用交互復雜度的增加,如實…

Prometheus Operator:Kubernetes 監控自動化實踐

在云原生時代,Kubernetes 已成為容器編排的事實標準。然而,在高度動態的 Kubernetes 環境中,傳統的監控工具往往難以跟上服務的快速變化。Prometheus Operator 應運而生,它將 Prometheus 及其生態系統與 Kubernetes 深度融合&…

一種融合人工智能與圖像處理的發票OCR技術,將人力從繁瑣的票據處理中解放

在數字化浪潮席卷全球的今天,發票OCR技術正悄然改變著企業財務流程的運作模式。這項融合了人工智能與圖像處理的前沿技術,已成為財務自動化不可或缺的核心引擎。核心技術:OCR驅動的智能識別引擎發票OCR技術的核心在于光學字符識別&#xff08…

時空大數據:數字時代的“時空羅盤“

引言:為何需要“時空大數據”?“大數據”早已成為熱詞,但“時空大數據”的提出卻暗含深刻邏輯。中國工程院王家耀院士指出,早期社會存在三大認知局限:過度關注商業大數據而忽視科學決策需求;忽視數據的時空…

PySide筆記之信號連接信號

PySide筆記之信號連接信號code review! 在 PySide6(以及 Qt 的其他綁定,如 PyQt)中,信號可以連接到信號。也就是說,可以把一個信號的發射,作為另一個信號的觸發條件。這樣做的效果是:當第一個信…

Linux操作系統之線程:線程概念

目錄 前言: 一、進程與線程 二、線程初體驗 三、分頁式存儲管理初談 總結: 前言: 大家好啊,今天我們就要開始翻閱我們linux操作系統的另外一座大山:線程了。 對于線程,大體結構上我們是劃分為兩部分…

windows利用wsl安裝qemu

首先需要安裝wsl,然后在swl中啟動一個子系統。這里我啟動一個ubuntu22.04。 接下來的操作全部為在子系統中的操作。 檢查虛擬化 在開始安裝之前,讓我們檢查一下你的機器是否支持虛擬化。 要做到這一點,請使用以下命令: sean@DESKTOP-PPNPJJ3:~$ LC_ALL=C lscpu | grep …

如何使用 OpenCV 打開指定攝像頭

在計算機視覺應用中,經常需要從特定的攝像頭設備獲取視頻流。例如,在多攝像頭環境中,當使用 OpenCV 的 cv::VideoCapture 類打開攝像頭時,如果不指定攝像頭的 ID,可能會隨機打開系統中的某個攝像頭,或者按照…

JAVA面試寶典 -《分布式ID生成器:Snowflake優化變種》

🚀 分布式ID生成器:Snowflake優化變種 一場訂單高峰,一次鏈路追蹤,一條消息投遞…你是否想過,它們背后都依賴著一個“低調卻關鍵”的存在——唯一ID。本文將帶你深入理解分布式ID生成器的核心原理與工程實踐&#xff0…

蘋果的機器學習框架將支持英偉達的CUDA平臺

蘋果專為Apple Silicon設計的MLX機器學習框架即將迎來CUDA后端支持,這意義重大。原因如下。 這項開發工作由GitHub開發者zcbenz主導(據AppleInsider報道),他于數月前開始構建CUDA支持的原型。此后他將項目拆分為多個模塊&#xff…

golang語法-----變量、常量

變量1、聲明與初始化(1)標準聲明 (先聲明,后賦值)var age int // 聲明一個 int 類型的變量 age,此時 age 的值是 0 fmt.Println(age) // 輸出: 0age 30 // 給 age 賦值 fmt.Println(age) // 輸出: 30//int 的零…