RabbitMQ 高級特性之持久性

1. 簡介

在 RabbitMQ 的消息發送流程中,一共有三種消息丟失的情況:

  1. 生產者給 broker 發送的消息,broker 沒有收到
  2. broker 將消息丟失
  3. broker 給消費者發送消息時消息丟失

對于第一種情況,我們可以使用 RabbitMQ 提供的發布確認模式;

對于第三種情況,我們可以使用 RabbitMQ 的發布確認特性;

對于第二種情況,我們可以使用 RabbitMQ 的持久化特性。

2. 什么是持久化特性

RabbitMQ 的持久化表示的是資源存儲在硬盤中,當 RabbitMQ 服務器重啟后,設置為持久化的資源不會被釋放,除非手動刪除,不然不會丟失。

RabbitMQ 的持久化特性分為:

  • 交換機持久化
  • 隊列持久化
  • 消息持久化

3. 交換機持久化

在 spring 中,我們聲明交換機時,可以為交換機指定是否持久化。

聲明持久化交換機:

    //寫法一  @Bean("persExchange")public DirectExchange persExchange() {return ExchangeBuilder.directExchange(Constants.PRES_EXCHANGE).build();}//寫法二@Bean("persExchange")public DirectExchange persExchange() {return ExchangeBuilder.directExchange(Constants.PRES_EXCHANGE).durable(true).build();}

在寫法一中,沒有指定 durable 參數,那么默認就會聲明一個持久化交換機。

聲明非持久化交換機:

    @Bean("notPersExchange")public DirectExchange notPersExchange() {return ExchangeBuilder.directExchange(Constants.NOT_PERS_EXCHANGE).durable(false).build();}

將 durable 參數設置為 false,就會聲明一個非持久化交換機。

4. 隊列持久化

我們也可以為隊列指定是否持久化。

聲明持久化隊列:

    @Bean("persQueue")public Queue persQueue() {return QueueBuilder.durable(Constants.PERS_QUEUE).build();}

調用 durable 方法即可聲明一個持久化隊列。

聲明非持久化隊列:

    @Bean("notPersQueue")public Queue notPersQueue() {return QueueBuilder.nonDurable(Constants.NOT_PERS_QUEUE).build();}

調用 nonDurable 方法即可聲明一個持久化隊列。

5. 消息持久化

生產者在發送消息時,可以指定該消息是否持久化。

發送持久化消息:

    @RequestMapping("/pres")public String pers() {String messageInfo = "pres message";Message message = new Message(messageInfo.getBytes(StandardCharsets.UTF_8),new MessageProperties());//設置消息持久化message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);rabbitTemplate.convertAndSend(Constants.PRES_EXCHANGE, Constants.PERS_ROUTINGKEY, message);return "持久化消息發送成功";}

MessageDeliveryMode 提供了兩個參數,分別為?PERSISTENT 和 NON_PERSISTENT,表示持久化和非持久化。

發送非持久化消息:

    @RequestMapping("/nPres")public String nPers() {String messageInfo = "nPres message";Message message = new Message(messageInfo.getBytes(StandardCharsets.UTF_8),new MessageProperties());//設置消息非持久化message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);rabbitTemplate.convertAndSend(Constants.NOT_PERS_EXCHANGE, Constants.PERS_ROUTINGKEY, message);return "非持久化消息發送成功";}

6. 交換機、隊列、消息三者之間持久化的影響

  • 當交換機為持久化時,重啟服務器,交換機依然存在
  • 當交換機為非持久化時,重啟服務器,交換機不存在
  • 當隊列為持久化、隊列中的消息為持久化時,重啟服務器,隊列依然存在,隊列中的消息依然存在
  • 當隊列為持久化、隊列中的消息為非持久化時,重啟服務器,隊列依然存在,隊列中的消息不存在
  • 當隊列為非持久化、隊列中的消息為持久化時,重啟服務器,隊列不存在,隊列中的消息不存在
  • 當隊列為非持久化、隊列中的消息為非持久化時,重啟服務器,隊列不存在,隊列中的消息不存在

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

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

相關文章

應急響應靶機-近源OS-1-知攻善防實驗室

前景需要: 小王從某安全大廠被優化掉后,來到了某私立小學當起了計算機老師。某一天上課的時候,發現鼠標在自己動彈,又發現除了某臺電腦,其他電腦連不上網絡。感覺肯定有學生搗亂,于是開啟了應急。 1.攻擊…

Linux 內存管理與緩存機制

文章目錄 內存介紹buff/cache 與匿名頁Swap(交換空間):內存的臨時倉庫 內存回收與Swap機制內存頁的兩種類型內核回收決策流程如何解讀內存狀態drop_caches 參數說明 實踐操作查看內存狀態查看Swap狀態釋放 buff/cache 緩存 內存介紹 當使用 …

【嵌入式電機控制#6】編碼器原理與內部構造

一、簡介 編碼器是一種將直線位移和角位移數據轉換為脈沖信號、二進制編碼的設備。常用于測量物體運動的位置、角度或速度。 二、分類 1. 按檢測分類: (1)光電式編碼器 (2)磁電式編碼器 2. 編碼類型分類: …

FastAPI 安裝使用教程

一、FastAPI 簡介 FastAPI 是一個現代、快速(高性能)的 Web 框架,基于 Python 3.7 和標準類型提示構建,廣泛應用于 API 服務開發。它使用 Pydantic 進行數據驗證,集成自動生成 OpenAPI 和文檔 UI,非常適合…

【WPF】WPF(樣式)

Window.Resources 當前窗體作用域資源 TargetType“Button” 使得當前窗體的組件類型都適配此樣式<Window.Resources><Style TargetType"Button"><Setter Property"Background" Value"WhiteSmoke"></Setter><Setter…

Jmeter(六):json斷言元件,jmeter參數化實現

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 json斷言元件 json斷言元件介紹 json斷言元件與響應斷言元件的功能類型&#xff0c;它只針對響應正文為json數據格 式的內容進行斷言功能。 添加路徑&…

python3常用模塊

1 數學運算模塊 math “math”模塊提供了許多常用的數學函數&#xff0c;例如三角函數、四舍五入、指數、對數、平方根、總和等 import math1.1 常數 math.pi 返回圓周率的數學常數。math.e 返回指數的數學常數示例&#xff1a; print(math.pi) print(math.e)1.2 fabs(x) …

基于Pandas和FineBI的昆明職位數據分析與可視化實現(二)- 職位數據清洗與預處理

文章目錄 一、數據集介紹二、缺失值處理三、重復值處理四、薪資數據格式處理五、技能格式處理六、拆分薪資列并處理異常值七、拆分工作區域列八、清洗后的數據集九、完整代碼 一、數據集介紹 這份昆明職位數據集源自 Boss 直聘&#xff0c;數據量頗為豐富&#xff0c;包含 177…

工業4.0核心引擎!意法STM32F407ZET6 單片機 賦能智能PLC/網關設計

STM32F407ZET6 單片機深度解析 1. 產品定位 STM32F407ZET6 是意法半導體&#xff08;STMicroelectronics&#xff09;推出的 高性能ARM Cortex-M4單片機&#xff0c;采用 LQFP144封裝&#xff0c;主打 浮點運算、豐富外設和工業級可靠性&#xff0c;廣泛應用于需要復雜算法和實…

[Andrej Karpathy_2] vibe coding | 大型語言模型的1960年代 | 自主性滑塊

Hugging Face的Tom Wolf分享了一段我非常喜歡的視頻&#xff0c;這些孩子正在進行氛圍編程。 我覺得這是一個非常治愈的視頻&#xff0c;我愛這個視頻。&#xff08;they grow up "knowing" they can build anything &#x1f62d;greatness) 未來是美好的 前文&…

uv包管理常用命令

uv常用命令 uv init 初始化項目 uv add 包名 添加包&#xff1b;多個包名&#xff0c;中間用空格 uv tree 包的關系 uv remove 刪除所有包 uv sync 重新解析 安裝工具 1、mypy 檢測工具 uv tool install mypy uv tool run mypy xxx.py 使用 2、Ruff uv tool…

Nano-vLLM 源碼學習

以下內容由Trae生成。我只管問和排版。 Nano-vLLM 是一個從零構建的輕量級vLLM實現項目&#xff0c;具備快速離線推理、代碼可讀性高和優化功能豐富等特點&#xff0c;性能表現和原版vLLM相媲美。以下是該項目各目錄和文件的功能說明&#xff1a; 1. 根目錄&#xff1a; benc…

MySQL 8.4 備份與恢復完全指南

本文全面解析MySQL 8.4的備份與恢復機制&#xff0c;涵蓋備份類型、方法、策略及實際操作示例。 一、備份類型解析 1. 物理(原始)備份 vs 邏輯備份 特性物理備份邏輯備份原理直接復制數據庫目錄/文件&#xff08;如數據文件、日志&#xff09;導出邏輯結構&#xff08;CREATE…

Mac 部署Latex OCR并優化體驗(打包成App并支持全局快捷鍵)

&#x1f341; 前言 最近閱讀論文&#xff0c;在做筆記的時候總是要手動輸入一些latex公式&#xff0c;非常耗時。我使用Hapigo的Latex 公式識別&#xff0c;感覺還挺好用&#xff0c;但是缺陷是只有30次免費額度&#xff0c;于是在網上搜索了一下&#xff0c;發現可以通過本地…

128K 長文本處理實戰:騰訊混元 + 云函數 SCF 構建 PDF 摘要生成器

一、背景 在數字化辦公時代&#xff0c;PDF 文檔因其格式穩定、兼容性強等特點&#xff0c;成為知識分享與文檔存儲的主要載體之一。但隨著文檔規模的增長&#xff0c;如何快速提取關鍵信息成為亟待解決的問題。尤其對于 128K 字符及以上的長文本 PDF&#xff0c;傳統處理方法…

Elasticsearch 排序性能提升高達 900 倍

作者&#xff1a;來自 Elastic Benjamin Trent, Mayya Sharipova, Chenhui Wang 及 Libby Lin 了解我們如何通過更快的 float / half_float 排序和 integer 排序的延遲優化來加快 Elasticsearch 排序速度。 Elasticsearch 引入了大量新功能&#xff0c;幫助你為你的使用場景構建…

Nginx重定向協議沖突解決方案:The plain HTTP request was sent to HTTPS port

問題原因 ??服務器運行在 HTTPS 模式&#xff0c;但代碼卻發出了 HTTP 重定向指令&#xff0c;兩套協議對不上&#xff0c;瀏覽器直接報錯。?? 在Java中&#xff0c;常見于response.sendRedirect()方法的使用。該方法默認生成基于HTTP的絕對URL&#xff0c;即便原始請求是…

機器學習如何讓智能推薦“更懂你”,助力轉化率飛躍?

機器學習如何讓智能推薦“更懂你”,助力轉化率飛躍? 今天咱聊聊一個電商、內容平臺、社交App都離不開的“秘密武器”——智能推薦系統,以及機器學習到底如何幫它提升轉化率的。 說白了,轉化率就是“點進去買單”的概率。智能推薦做得好,轉化率能蹭蹭上漲;做不好,用戶滑…

Ruby CGI Session

Ruby CGI Session 引言 CGI&#xff08;Common Gateway Interface&#xff09;是一種網絡服務器與外部應用程序&#xff08;如腳本或程序&#xff09;進行通信的協議。在Ruby語言中&#xff0c;CGI被廣泛用于創建動態網頁。本文將深入探討Ruby CGI Session的相關知識&#xf…

從零開始的云計算生活——第二十四天,重起航帆,初見MySQL數據庫

一.故事劇情 接下來要進入到一條比較長的路——mysql數據庫&#xff0c;之后會用一段時間來學習mySQL數據庫的內容&#xff0c;今天先從基礎開始介紹mysql數據庫。 二.MySQL數據庫概述 1.數據庫概念 數據庫(Database) 簡稱DB&#xff0c;按照一定格式存儲數據的一些文件的…