rabbitmq ACK

在消息隊列(如 RabbitMQ)中,**ACK(Acknowledgement)是消息確認機制**,用于確保消息被消費者成功處理。其核心作用是解決以下問題:

mermaid復制代碼導出svg


📌 ACK 的兩種模式

1.?自動確認模式 (Auto-ACK)
  • 消費者收到消息時,RabbitMQ?立即刪除隊列中的消息
  • 風險:若消費者處理消息時崩潰,消息永久丟失

python復制代碼

channel.basic_consume(queue="my_queue",auto_ack=True,  # ?? 危險模式on_message_callback=callback
)
2.?手動確認模式 (Manual ACK)?? 推薦
  • 消費者處理完業務邏輯后,顯式發送 ACK
  • RabbitMQ 收到 ACK 后才刪除消息
  • 處理失敗時可拒絕消息(NACK)

python復制代碼

def callback(channel, method, properties, body):try:process_message(body)  # 業務處理channel.basic_ack(delivery_tag=method.delivery_tag)  # ? 手動確認except Exception:# 處理失敗:拒絕消息并重新入隊channel.basic_nack(delivery_tag=method.delivery_tag, requeue=True)

🔧 ACK 的三大核心作用

場景無 ACK 機制開啟手動 ACK
消費者崩潰消息丟失 ?消息重新投遞給其他消費者 ?
處理邏輯出錯消息被誤刪除 ?觸發重試機制 ?
高并發場景可能因消息積壓導致內存溢出 ??控制消息流速(QoS)?

🛠 最佳實踐:手動 ACK + QoS

python復制代碼

# 1. 設置每次只接收一條消息(避免消息積壓)
channel.basic_qos(prefetch_count=1)  # 🚦 流量控制# 2. 消費消息(關閉自動ACK)
channel.basic_consume(queue="orders",auto_ack=False,  # ? 手動確認模式on_message_callback=process_order
)# 3. 在回調函數中顯式ACK
def process_order(channel, method, properties, body):try:save_to_database(body)   # 業務操作charge_credit_card(body) # 關鍵業務channel.basic_ack(delivery_tag=method.delivery_tag)  # ? 確認except PaymentFailed:# 支付失敗:消息重新入隊等待重試channel.basic_nack(delivery_tag=method.delivery_tag, requeue=True)except InvalidOrder:# 無效訂單:拒絕并不再重試channel.basic_reject(delivery_tag=method.delivery_tag, requeue=False)

?? 關鍵注意事項

  1. 忘記 ACK 的后果

    • 消息會一直保留在隊列中(顯示?Unacked?狀態)
    • 導致消息堆積,最終阻塞整個隊列
  2. NACK 與 Reject 的區別

    • basic_nack():支持批量拒絕多條消息
    • basic_reject():只能拒絕單條消息
  3. 死信隊列配合
    當消息被拒絕且?requeue=False?時,可將其路由到死信隊列進行分析:

    python復制代碼

    # 聲明隊列時綁定死信交換機
    args = {"x-dead-letter-exchange": "dead_letter_exchange"}
    channel.queue_declare(queue="orders", arguments=args)
    

🌟 總結:ACK 的本質

ACK 是消息可靠性的最后一道防線
它通過?生產者 → RabbitMQ → 消費者?的閉環確認機制,實現:

  • 至少一次投遞(At Least Once Delivery)
  • 防消息丟失(即使消費者崩潰)
  • 業務可重試性(通過 NACK 機制)

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

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

相關文章

性能遠超Spring Cloud Gateway!Apache ShenYu如何重新定義API網關!

Apache ShenYu Apache ShenYu是一個異步的,高性能的,跨語言的,響應式的 API 網關。 特點 ? 代理:支持Apache Dubbo,Spring Cloud,gRPC,Motan,SOFA,TARS,We…

質變科技亮相可信數據庫發展大會,參編《數據庫發展研究報告2025》

數據庫作為支撐數據存儲與計算的關鍵載體,在數據要素時代的重要性愈發凸顯。過去一年,全球數據庫新技術、新業態、新模式不斷涌現;我國數據庫應用創新于重點行業快速推進。隨著人工智能技術深刻變革,數據庫與AI融合趨勢愈發明顯。…

LVS(Linux Virtual Server)詳細筆記(理論篇)

一.詳解1. LVS概述LVS(Linux Virtual Server)是由章文嵩博士發起的開源負載均衡項目,通過在Linux內核中實現高性能四層交換能力,將多臺物理服務器組織成單一虛擬服務。它能夠處理百萬級并發連接,同時保持線性擴展能力&…

Oracle Data Pump 導入沖突解決

問題場景 使用 impdp 導入數據時遇到"對象已存在"錯誤,導致導入失敗。 核心解決方案 1. TABLE_EXISTS_ACTION 參數 impdp username/passworddatabase \ directoryDATA_PUMP_DIR \ dumpfileyour_dump_file.dmp \ TABLE_EXISTS_ACTIONREPLACE作用&#xff1…

汽車免拆診斷案例 | 2015款進口起亞索蘭托L車漏電

故障現象 一輛2015款進口起亞索蘭托L車,搭載D4HB發動機,累計行駛里程約為15萬km。車主反映,該車停放2天左右就因蓄電池虧電而無法起動,更換過蓄電池,但故障依舊,于是將車開至我廠檢修。故障診斷 接車后用…

mysql復制延遲如何處理

一、復制延遲的原因主庫增刪改并發大大表在做DDL從庫備份導致延遲大事務從庫機器配置差二、怎樣判斷延遲使用 SHOW SLAVE STATUS 命令Seconds_Behind_Master:表示從庫落后主庫的秒數(若為 NULL,可能復制線程已停止)對比位點字段名…

HertzBeat 監控 SpringBoot 使用案例

HertzBeat 監控 SpringBoot 使用案例 在云原生時代,Spring Boot應用的監控與可視化已然成為運維體系的核心環節,實時監控應用性能是保障系統穩定性的關鍵。 這篇文章將結合 HertzBeat 實現從指標采集、可視化到告警的一體化解決方案,并展示…

突破性量子芯片問世:電子與光子首次集成,開啟量子技術規模化應用新篇章

文丨浪味仙 排版丨浪味仙行業動向:3000字丨8分鐘閱讀內容提要在量子技術邁向規模化應用的征程中,研究人員迎來了重要突破。近日,波士頓大學、加州大學伯克利分校以及西北大學的科學家在《Nature Electronics》上發表論文,報告實現…

day30——零基礎學嵌入式之線程2.0

一、進程和線程的對比線程進程定義輕量級的進程。是進程中的執行單元,作為CPU調度的基本單位進程時程序的一次執行過程,作為CPU的資源分配的基本單位優勢創建以及切換速度塊-----效率高線程(線程共享了進程的資源)間共享資源方便創…

洛谷 P1395 會議

【題目鏈接】 洛谷 P1395 會議 【題目考點】 1. 樹形動規:樹的重心 本題為求樹的重心模板題 【解題思路】 樹的重心:相比于樹中其它結點,其所有的子樹中結點數最多的子樹的結點數最少,該結點就是這棵樹的重心。 另一種定義&…

Microsoft 365 Adoption Score功能深度解析:驅動企業數字化轉型的利器

在數字化轉型的浪潮中,Microsoft 365(原Office 365)憑借其強大的生產力工具和云服務生態,已成為全球企業和組織提升效率、協作和創新的核心平臺。然而,僅僅部署Microsoft 365并不足以充分發揮其潛力,關鍵在于如何推動員工高效采用這些工具,并將其融入日常工作流程。為此…

尺寸標注識別5 實例分割 roboflow | result.boxes獲取邊界框 | yolov8n-seg架構 torchinfo | 對直線關系不敏感

https://gitee.com/njsgcs/yolo-local 單標注一個尺寸線 100輪就百分百了 Sign in to Roboflow 有混起來的問題 roboflow訓練用的cocon-seg模型我網上找不到 上面這種比較麻煩 text的中心要在dt范圍內 屏幕點以下等同于按下save(enter) 取最長線段作…

敏捷開發卡在需求分析?飛算 JavaAI 加速需求確認與功能迭代

在敏捷開發中,需求分析常成為團隊推進的 “卡點”—— 模糊的需求描述、反復的需求變更、拆解落地難等問題,往往導致迭代周期延長。而飛算 JavaAI 作為專為 Java 開發設計的工具,正通過 “需求理解 - 接口設計 - 代碼生成” 的全流程智能化&a…

QT跨平臺應用程序開發框架(10)—— Qt窗口

目錄 一,關于窗口 二,菜單欄 2.1 菜單介紹 2.2 添加菜單 2.3 添加快捷鍵 2.4 添加其子菜單 2.5 添加分割線和圖標 三,工具欄 3.1 添加和使用工具欄 3.2 設置位置屬性 四,狀態欄 五,浮動窗口 六,對話框 6.1 …

git從本地倉庫添加到遠程倉庫

先創建,然后配置 Git 的全局用戶名和郵箱git config --global user.name "不吃糖o" git config --global user.email "1523944556qq.com" git config --global -l 查看設置的用戶名和郵箱如何生成SSH公鑰?ssh-keygen 生成sshkeyls ~…

鎖步核,為什么叫鎖步核?

“鎖步核”(Lockstep Cores)這一名稱源于其工作原理與軍事隊列行進中的“鎖步”(Lockstep)動作的類比。以下是詳細的說明整理:1. 軍事起源:什么是“鎖步”? 在傳統軍事訓練中,“鎖步…

python學智能算法(二十二)|SVM-點與超平面的距離

引言 前序學習進程中,了解了向量、向量點積運算、超平面、感知機等知識點。 SVM算法最核心的目標是通過規劃租號的分割超平面,來使得超平面附近的點到超平面的距離和達到最大值。 那點和超平面的距離如何計算,就是今天學習的重點。 點與超平…

參會邀請!2025世界人工智能大會合合信息技術交流日報名啟動!

2025世界人工智能大會即將開幕,合合信息邀請您一起參與KOL深度技術交流活動。本次活動不僅可以帶您逛展2025世界人工智能大會,在合合信息展臺體驗AI黑科技,還可以與行業頂尖技術專家面對面交流,共同探討當下熱門AI安全話題。 詳細…

零基礎入門:用C++從零實現TCP Socket網絡小工具

個人主頁:chian-ocean 文章專欄-Linux 前言: 網絡編程中的套接字(Socket)是通信的基本接口,允許不同計算機之間通過網絡交換數據。套接字是計算機網絡中通信的“端點”,通過它,應用程序可以與…

SOES:軟實現EtherCAT從站協議棧項目介紹及從站開發案例

在現代工業自動化領域,EtherCAT(Ethernet for Control Automation Technology)以其高速、實時和開放的特性,成為現場總線通信的主流協議之一。EtherCAT網絡中,主站(Master)負責調度和管理&#…