RabbitMQ的特點和消息可靠性保障

掌握RabbitMQ的核心知識,需從其特點和消息可靠性保障(尤其是消息丟失解決方案)兩方面入手,以下是詳細說明:

一、RabbitMQ的核心特點

RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)協議的開源消息中間件,其核心特點如下:

  1. 靈活的消息路由模型
    采用“交換機(Exchange)-隊列(Queue)-綁定(Binding)”的三層結構,支持多種交換機類型(Direct、Topic、Fanout、Headers),可根據路由鍵(Routing Key)或消息屬性靈活路由消息,滿足復雜業務場景(如廣播、按規則過濾消息等)。

  2. 高可靠性
    支持消息持久化(通過設置delivery_mode=2)、隊列持久化(durable=true)、交換機持久化,確保RabbitMQ重啟后消息不丟失;同時提供消息確認機制(生產者確認、消費者確認),保障消息傳遞的可靠性。

  3. 高可用性
    支持集群部署和鏡像隊列(Mirror Queue),鏡像隊列可將隊列數據同步到多個節點,避免單節點故障導致消息丟失,提高系統可用性。

  4. 流量控制與限流
    支持消費者限流(通過basic.qos設置prefetch_count,控制消費者一次接收的消息數量),避免消費者因處理能力不足導致消息堆積或丟失;同時可通過TTL(消息過期時間)和死信隊列處理無效消息。

  5. 豐富的附加功能
    支持消息優先級(通過priority屬性設置)、延遲消息(通過死信隊列+TTL實現,或安裝rabbitmq_delayed_message_exchange插件)、消息回溯(通過日志或備份)等,滿足多樣化業務需求。

二、消息丟失的解決方案

消息在傳遞過程中可能因生產者發送失敗、RabbitMQ服務器故障、消費者處理失敗三個環節丟失,需針對性解決:

1. 生產者發送消息時丟失(未到達RabbitMQ)

原因:網絡波動、生產者未確認消息是否被RabbitMQ接收,導致消息在傳輸中丟失。

解決方案

  • 開啟生產者確認機制(Publisher Confirm)
    生產者通過channel.confirmSelect()開啟確認模式,RabbitMQ在成功接收消息并持久化后,會向生產者返回確認通知(basic.ack);若失敗則返回否定通知(basic.nack)。生產者通過監聽確認結果,可重試未確認的消息。

    channel.confirmSelect(); // 開啟確認模式
    channel.basicPublish(exchange, routingKey, msg);
    if (channel.waitForConfirms()) { // 等待確認// 消息發送成功
    } else {// 消息發送失敗,重試
    }
    
  • 處理消息路由失敗場景(Publisher Return)
    若消息無法路由到隊列(如交換機未綁定隊列、路由鍵不匹配),RabbitMQ默認會丟棄消息。可通過channel.addReturnListener()監聽路由失敗的消息,將其轉發到備份隊列或重試。

    channel.addReturnListener((replyCode, replyText, exchange, routingKey, properties, body) -> {// 處理路由失敗的消息(如轉發到備份交換機)
    });
    // 發送消息時設置mandatory=true,強制返回路由失敗的消息
    channel.basicPublish(exchange, routingKey, true, properties, body);
    
  • 使用備份交換機(Alternate Exchange)
    為交換機設置備份交換機(AE),當消息無法路由到目標隊列時,會自動轉發到AE綁定的備份隊列,避免消息被丟棄。

2. RabbitMQ服務器存儲時丟失(已接收但未持久化)

原因:RabbitMQ宕機時,未持久化的消息(內存中)會丟失;或隊列/交換機未持久化,重啟后隊列消失導致消息丟失。

解決方案

  • 全鏈路持久化

    • 交換機持久化:創建交換機時設置durable=true,確保重啟后交換機不丟失。
    • 隊列持久化:創建隊列時設置durable=true,確保重啟后隊列不丟失。
    • 消息持久化:發送消息時設置delivery_mode=2(AMQP協議中持久化標識),確保消息被寫入磁盤(而非僅存于內存)。
  • 開啟鏡像隊列(集群環境)
    在集群中配置鏡像隊列,將隊列數據同步到多個節點(如ha-mode=all表示同步到所有節點),避免單節點故障導致消息丟失。

3. 消費者接收消息后丟失(未處理完成)

原因:消費者接收到消息后,未處理完成就宕機,而RabbitMQ默認自動確認(autoAck=true),會刪除消息,導致消息丟失。

解決方案

  • 關閉自動確認,開啟手動確認(Consumer ACK)
    消費者設置autoAck=false,處理完消息后手動調用basicAck確認;若處理失敗,調用basicNackbasicReject拒絕(可設置requeue=true讓消息重新入隊,避免丟失)。

    // 消費者接收消息時關閉自動確認
    channel.basicConsume(queueName, false, (consumerTag, delivery) -> {try {// 處理消息processMessage(delivery.getBody());// 處理完成,手動確認channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);} catch (Exception e) {// 處理失敗,拒絕并重新入隊channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true);}
    }, consumerTag -> {});
    
  • 消費者限流(避免過載)
    通過basic.qos設置prefetch_count(如prefetch_count=1),控制消費者一次僅接收1條消息,處理完成并確認后再接收下一條,避免因消息堆積導致處理失敗。

總結

RabbitMQ的消息可靠性需通過生產者確認+全鏈路持久化+消費者手動確認三環節協同保障,同時結合鏡像隊列(集群)和備份交換機等機制,可最大程度避免消息丟失。實際應用中需根據業務場景(如一致性要求、性能需求)調整配置,平衡可靠性與效率。

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

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

相關文章

項目升級啦

公司要新做一個醫療行業的業務,經過業務端和產品端的評估該業務與公司已有的產品線關聯不大,用戶后續也不想在老系統那臺老爺車上繼續使用,話說老系統到現在差不多10年了,中間經歷過的前后端開發者形形色色,維護者換了…

Android中頁面生命周期變化

一、Activity切換的生命周期變化(A啟動B)1. 標準流程(B完全覆蓋A)完整生命周期路徑:Activity A:onPause():失去焦點,仍部分可見onStop():完全不可見(當B完全覆…

自動駕駛控制算法——PID算法

自動駕駛控制算法——PID算法 文章目錄自動駕駛控制算法——PID算法一、PID 是什么?二、PID 原理2.1 **比例環節(P)**2.2 **積分環節(I)**2.3 **微分環節(D)**2.4 特點總結2.5 案例分析 —— 小…

Spring Boot 異步執行方式全解析:@Async、CompletableFuture 與 TaskExecutor 對比

在 Spring Boot 開發中,異步執行是提升系統性能的重要手段,尤其適用于處理耗時操作(如日志記錄、郵件發送、數據同步等)。本文將深入對比 Spring Boot 中三種主流的異步實現方式 ——Async注解、手動CompletableFuture和直接使用T…

高效微調2:Prompt-Tuning原理與實戰

高效微調2:Prompt-Tuning原理與實戰 Prompt-Tuning原理介紹 代碼 Prompt-Tuning原理介紹 Prompt-Tuning Prompt-Tuning的思想:凍結主模型全部參數,在訓練數據前加入一小段Prompt,只訓練Prompt的表示層,即一個Embedding模塊。其中,Prompt.又存在兩種形式,一種是hard promp…

使用BART模型和T5模型實現文本改寫

BART模型BART(Bidirectional and Auto-Regressive Transformers)是由 Facebook AI Research(FAIR)在 2019 年提出的序列到序列(seq2seq)預訓練模型,論文發表于《BART: Denoising Sequence-to-Se…

電商前端Nginx訪問日志收集分析實戰

使用FileBeatLogstashES實現分布式日志收集 在大型項目中 ,往往服務都是分布在非常多不同的機器上 ,每個機器都會打印自己的log日志 但是 ,這樣分散的日志 ,本來就無法進行整體分析。再加上微服務的負載均衡體系 ,甚至…

TwinCAT3示例項目1

目錄一、需求分析二、程序編寫1.實現1盞燈的自控(IF、TOF)2. 添加模式控制(Case、枚舉)3. 添加多盞燈(FOR、數組)4. 添加多組燈(二維數組)END項目結合了,FB,I…

如何在 VMware Workstation 虛擬機中利用 Nvidia 顯卡的硬件加速功能

這篇文章詳細介紹了如何在 VMware Workstation 虛擬機中利用 Nvidia 顯卡的硬件加速功能,通過 PCI 設備直通(Pass-Through)技術將顯卡分配給虛擬機使用: 在 VMware Workstation 虛擬機中利用 Nvidia 顯卡的硬件加速功能 1. 檢查…

設計模式(二十二)行為型:策略模式詳解

設計模式(二十二)行為型:策略模式詳解策略模式(Strategy Pattern)是 GoF 23 種設計模式中最具實用性和廣泛影響力的行為型模式之一,其核心價值在于定義一系列算法或行為,并將每個算法封裝到獨立…

AI+向量化

要理解 Java 如何結合 AI 與向量化,我們需要從向量化的核心概念、AI 中向量化的作用、Java 生態中的實現工具以及具體實踐案例四個維度展開。以下是詳細解析:一、核心概念:向量化與 AI 的關系向量化(Vectorization)是將…

Bootstap Vue 之b-form-radio-group 不顯示選中狀態問題

代碼類似&#xff1a;<b-form-radio-groupclass"mt-2"required:disabled"dfrmDisabled"v-model"childDikeForm.SafetyAppraisalRank":options"[一, 二, 三, 四]"name"rankradioopt"></b-form-radio-group>經過測…

Shell 腳本實戰:基于 for 循環的批量操作三例(賬戶創建、網絡檢測與密碼管理)

一、編寫腳本for1.sh,使用for循環創建20賬戶&#xff0c;賬戶名前綴由用戶從鍵盤輸入&#xff0c;賬戶初始密碼由用戶輸入&#xff0c;例如:test1、test2、test3、......、test10實現思路通過read命令獲取用戶輸入的賬戶前綴和初始密碼&#xff1b;加入非空校驗&#xff1a;若前…

PBR技術

一 、PBR的概述1.定義策略路由&#xff1a; PBR 是一種覆蓋路由器默認路由決策機制的技術。它允許管理員根據策略&#xff08;而不僅僅是目標地址&#xff09;來設置數據包的下一跳 IP 地址、出站接口、IP 優先級/DSCP 值等。路由策略&#xff1a;是指在路由器或三層設備上&…

STM32-ESP8266Wi-Fi模塊使用USART實現通信/創建AP和STA模式配置教程(寄存器版)

本章思維導圖&#xff1a;ESP8266WIFI模塊簡介ESP8266 是一款由樂鑫科技推出的低成本、高性能 Wi-Fi 模塊&#xff0c;廣泛應用于物聯網和嵌入式開發領域。WIFI的頻段5G和2.4G2.4G Wi-Fi與5G Wi-Fi最本質的區別即工作頻段&#xff08;無線電波的頻率&#xff09;不一樣&#xf…

算法26. 刪除有序數組中的重復項

給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回 nums 中唯一元素的個數。 考慮 nums 的唯一元素的數量為 k &#xff0c;你…

ROS2中傳輸樣條曲線

在ROS2中傳輸樣條曲線需要解決兩個核心問題&#xff1a;**如何結構化表示曲線數據**和**如何高效傳輸**。以下是一套完整方案&#xff0c;結合自定義消息設計、序列化優化和QoS配置實現可靠傳輸&#xff1a;---### &#x1f4d0; 一、定義樣條曲線的自定義消息 樣條曲線通常由控…

Win11怎樣安裝DirectX 9

通過微軟官方下載安裝&#xff1a;確認系統兼容性并準備&#xff1a;確保顯卡驅動為最新版本&#xff0c;因為 DirectX 與顯卡驅動程序緊密相關。同時&#xff0c;可暫時關閉防病毒軟件和防火墻&#xff0c;防止其干擾安裝過程。下載安裝程序&#xff1a;訪問微軟官方網站下載 …

RAGFLOW~Enable RAPTOR

Enable RAPTOR 一種遞歸抽象方法&#xff0c;用于長上下文知識檢索和摘要&#xff0c;在廣泛語義理解和細微細節之間取得平衡。 RAPTOR&#xff08;遞歸抽象處理用于樹狀組織檢索&#xff09;是一種在2024年論文中引入的增強文檔預處理技術。它旨在解決多跳問答問題&#xff0c…

【機器人+相機通訊】宇樹科技相機通信

https://github.com/unitreerobotics/xr_teleoperate/blob/main/README_zh-CN.md 相機驅動與服務端 https://github.com/unitreerobotics/xr_teleoperate/blob/main/teleop/image_server/image_server.py 其中相機如果是realsense, 安裝好驅動后&#xff0c;可以使用命令查看…