RabbitMQ 高級特性之死信隊列

1. 簡介

在前面的高級特性中,我們介紹了重試機制和 TTL,那么產生下列問題:

  • 在重試機制中,當消費者消費消息發生異常時,會觸發消息重發機制,由于我們配置了最大的重發次數,那么當超過這個次數后,若消息依然沒有被成功消費,就需要將消息進行保存,等待下一次消費,那么,這條消息應該保存到哪里去呢?
  • 在 TTL 機制中,我們為隊列和消息設置了過期時間,當超過這個時間后消息就會被刪除,但是這條消息是需要被消費的,于是就需要將過期的消息保存下來,等待下次消費。但是,消息應該保存到哪里去呢?

在 RabbitMQ 中,將類似于結果的消息稱為死信,那么就涉及到,變成死信的消息應該存儲到哪里去?

2. 會產生死信的場景

  • 消息重發后,次數到達指定重發次數依然未被消費,就會成為死信
  • 消息到達過期時間依然沒有被消費,就會成為死信
  • 隊列已經滿了,卻依然由消息入隊列,就會產生溢出,溢出的這部分消息就會成為死信

3. 死信隊列

在 RabbitMQ 中,可以聲明一個隊列,這個隊列專門用來存放死信,于是就成為死信隊列。

死信隊列的工作流程如下:

  1. 首先需要聲明一個死信交換機,與普通隊列進行綁定;
  2. 其次需要聲明一個死信隊列,與死信交換機進行綁定;
  3. 當普通隊列中的消息成為死信后,就會被發送給死信交換機,然后由死信交換機分配給與之綁定的死信隊列;
  4. 存儲在死信隊列中的死信會等待被別的消費者再次消費。

4. 配置死信交換機與死信隊列

聲明一個正常交換機,正常隊列,死信交換機,死信隊列,并將正常交換機與正常隊列進行綁定,將正常隊列與死信交換機進行綁定,將死信交換機與死信隊列進行綁定,代碼如下:

@Configuration
public class DLConfig {/*** 正常* @return*/@Bean("norQueue")public Queue norQueue() {return QueueBuilder.durable(Constants.NOR_QUEUE).ttl(10000) //過期時間 10s.deadLetterExchange(Constants.DL_EXCHANGE) //綁定死信交換機.deadLetterRoutingKey(Constants.DL_ROUTINGKEY).maxLength(10L) //隊列長度為 10.build();}@Bean("norExchange")public DirectExchange norExchange() {return ExchangeBuilder.directExchange(Constants.NOR_EXCHANGE).build();}@Bean("norBind")public Binding norBind(@Qualifier("norExchange") DirectExchange directExchange,@Qualifier("norQueue") Queue queue) {return BindingBuilder.bind(queue).to(directExchange).with(Constants.NOR_ROUTINGKEY);}/*** 死信*/@Bean("dlQueue")public Queue dlQueue() {return QueueBuilder.durable(Constants.DL_QUEUE).build();}@Bean("dlExchange")public DirectExchange dlExchange() {return ExchangeBuilder.directExchange(Constants.DL_EXCHANGE).build();}@Bean("dlBind")public Binding dlBind(@Qualifier("dlExchange") DirectExchange directExchange,@Qualifier("dlQueue") Queue queue) {return BindingBuilder.bind(queue).to(directExchange).with(Constants.DL_ROUTINGKEY);}
}

在上面的代碼中,我們指定了下面的條件:

  • 隊列的過期時間為 10s
  • 隊列長度為 10?

重試機制的配置如下:

spring:rabbitmq:listener:simple:acknowledge-mode: autoretry:enabled: true # 開啟消費者失敗重試initial-interval: 5000ms # 初始失敗等待時?為5秒max-attempts: 5 # 最?重試次數(包括自身消費的?次)

在上面的配置中,設置的最大的重發次數為 5 次。

5. 驗證消息重試超過規定次數是否進入死信隊列

生產者代碼如下:

    @RequestMapping("/dl")public String dl() {String messageInfo = "dl... ";rabbitTemplate.convertAndSend(Constants.NOR_EXCHANGE, Constants.NOR_ROUTINGKEY, messageInfo);return "消息發送成功";}

消費者代碼如下:

@Component
@Slf4j
public class DLListener {@RabbitListener(queues = Constants.NOR_QUEUE)public void listener(Message message) throws IOException {String messageInfo = new String(message.getBody());long deliveryTag = message.getMessageProperties().getDeliveryTag();log.info("接收消息, message: {}, deliveryTag: {}", messageInfo, deliveryTag);int num = 1 / 0;log.info("消息消費完成");}
}

代碼運行結果如下:

?

消息重發五次后拋出異常,觀察 RabbitMQ 客戶端后,這條消息已經存放進了死信隊列中:

??

6. 驗證 TTL 與死信隊列

生產者代碼如下:

    @RequestMapping("/dl")public String dl() {String messageInfo = "dl... ";rabbitTemplate.convertAndSend(Constants.NOR_EXCHANGE, Constants.NOR_ROUTINGKEY, messageInfo);return "消息發送成功";}

將正常隊列的 TTL 設置為 10s,運行代碼后,觀察 RabbitMQ 客戶端:

10s 前:

10s 后:

?

7. 驗證隊列溢出與死信隊列

將正常隊列的長度設置為 10,生產者向 RabbitMQ 發送 20 條數據,生產者代碼如下:

    @RequestMapping("/dl")public String dl() {for (int i = 0; i < 20; i++) {String messageInfo = "dl... " + i;rabbitTemplate.convertAndSend(Constants.NOR_EXCHANGE, Constants.NOR_ROUTINGKEY, messageInfo);}return "消息發送成功";}

運行代碼,觀察 RabbitMQ 客戶端:

可以看到,溢出的 10 條消息進入了死信隊列。?

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

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

相關文章

如何選擇合適的工業相機快門種類

在工業相機領域&#xff0c;常見的三種快門類型&#xff1a;全局快門&#xff08;Global Shutter&#xff09;、卷簾快門&#xff08;Rolling Shutter&#xff09;以及全局復位式卷簾快門&#xff08;Global - reset rolling Shutter&#xff09;。我們主要來講講全局快門&…

uloop源碼剖析

uloop是libubox庫的核心模塊&#xff0c;libubox是OpenWrt基礎庫之一&#xff0c;用來提供事件驅動、基礎數據結構等。 uloop支持文件描述符監控、超時定時器、子進程管理、信號處理事件、間隔定時器等五大核心功能。 主體框架 uloop循環的主體框架有三個函數構成&#xff0c…

Mac電腦 虛擬機 VMware Fusion13

VMware Fusion mac 不僅能讓你在Mac蘋果電腦上運行Windows或Linux系統、使用非Mac平臺的應用&#xff0c;而且還可以支持各種USB硬件設備。 原文地址&#xff1a;VMware Fusion 13 Mac虛擬機

嵌套容器是隱射宿主機的路徑而不是容器的路徑

嵌套容器是隱射宿主機的路徑而不是容器的路徑 為什么&#xff1f;容器中的 Docker 運行流程 為什么&#xff1f; 這個問題涉及 Docker 的工作原理&#xff0c;特別是嵌套容器的行為。讓我們逐步分析為什么在容器內部啟動其他容器時&#xff0c;文件系統的掛載行為是基于 宿主機…

Go語言--語法基礎6--基本數據類型--切片類型

Go 語言切片是對數組的抽象。Go 數組的長度不可改變&#xff0c;在特定場景中這樣的集合就不太適用&#xff0c;Go 中提供了一種靈活、功能強悍的內置類型切片 ("動態數組")&#xff0c;與數組相比切片的長度是不固定的&#xff0c;可以追加元素&#xff0c;在追加時…

?御控物聯網綜合應用實訓平臺-物聯網系統和實驗室實訓系統?

在科技飛速發展的今天&#xff0c;物聯網技術已滲透到各個領域&#xff0c;成為推動產業升級和創新發展的重要力量。對于職業教育和科研機構而言&#xff0c;搭建一套完善的物聯網綜合應用實訓系統&#xff0c;培養適應時代需求的物聯網專業人才&#xff0c;顯得尤為迫切。而御…

ElasticSearch中的分片是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【ElasticSearch中的分片是什么?】面試題。希望對大家有幫助&#xff1b; ElasticSearch中的分片是什么? 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; 在 Elasticsearch 中&#xff0c;分片&#xff08;Shard&#x…

基于PHP+MySQL組合開發開源問答網站平臺源碼系統 源碼開源可二次開發 含完整的搭建指南

問答網站成為人們獲取知識、交流經驗的重要平臺。無論是專業領域的疑難解答&#xff0c;還是生活常識的分享探討&#xff0c;問答網站都發揮著巨大的作用。對于想要搭建問答網站的個人或企業來說&#xff0c;一款優秀的開源問答網站平臺源碼系統至關重要。今天&#xff0c;我們…

Python工程師面試題集

文章目錄一、Python基礎二、關鍵Python庫三、Web開發四、并發與性能五、系統設計答案區一、Python基礎Python的可變與不可變數據類型有哪些&#xff1f;底層實現原理&#xff1f;Python2與Python3的主要區別解釋GIL全局解釋器鎖及其對多線程的影響裝飾器Decorator的作用與實現原…

什么是碼率?剪映中如何選擇適合的視頻碼率

在視頻編輯過程中&#xff0c;碼率&#xff08;Bitrate&#xff09;是一個決定視頻畫質的關鍵參數。對于普通用戶來說&#xff0c;剪映作為一款功能強大的視頻編輯工具&#xff0c;其默認的碼率設置直接影響最終導出視頻的質量和文件大小。那么&#xff0c;剪映的默認碼率是多少…

專題:2025電商營銷與AI應用發展趨勢報告|附260+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42834 電商行業在數字經濟浪潮中持續演進&#xff0c;2025年呈現出多平臺發力、技術驅動增長、消費需求多元等特點。快手和抖音作為國內直播電商的重要陣地&#xff0c;各品類銷售表現各有亮點&#xff0c;同時全球電商市場規模穩步…

windows安裝stable diffusion

安裝git https://git-scm.com/downloads/winclone項目 創建一個文件夾&#xff0c;clone下來stable diffusion webui git網址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git安裝…

Python爬蟲 XPath 三方庫lxml

前言 XPath是Python爬蟲最重要的過濾原始數據的手段之一,是爬蟲最核心的技術 是專業抓取HTML頁面而生的,基本上只用于抓取HTML頁面使用 目錄 安裝支持XPath三方庫lxml XPath代碼入門示例 XPath表達式語法 在源代碼上面直接獲取XPath 安裝支持XPath三方庫lxml pip instal…

深度學習洪水推演:Python融合多源衛星數據可視化南方暴雨災情

目錄1. 引言&#xff1a;多源衛星融合分析的突破性價值2. 多模態融合架構設計3. 雙流程對比分析3.1 單源 vs 多源融合分析3.2 洪水推演核心流程4. 核心代碼實現4.1 多源數據融合處理&#xff08;Python&#xff09;4.2 時空洪水推演模型&#xff08;PyTorch&#xff09;4.3 三維…

「日拱一碼」016 深度學習常用庫——PyTorch

目錄 張量操作 創建張量&#xff1a; torch.tensor() &#xff1a;直接從數據創建張量 torch.zeros() &#xff1a;創建全零張量 torch.ones() &#xff1a;創建全一張量 torch.randn() &#xff1a;創建正態分布隨機張量 torch.arange() &#xff1a;創建等差序列張量 …

【Qt】QStringLiteral 介紹

QStringLiteral 介紹 QStringLiteral 是 Qt 框架中提供的一個宏&#xff0c;用于在編譯時從字符串字面量創建 QString 對象&#xff0c;具有高效和零內存分配的特點。 主要特點 編譯時轉換&#xff1a;將字符串字面量在編譯時轉換為 QString 數據&#xff0c;而不是運行時。…

UI前端與數字孿生結合實踐探索:智慧物流的貨物追蹤與配送優化

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構智慧物流的技術范式在物流行業數字化轉型的浪潮中&#xff0…

Java創建型模式---工廠模式

工廠模式基礎概念 工廠模式是一種創建型設計模式&#xff0c;其核心思想是將對象的創建和使用分離。通過使用工廠模式&#xff0c;可以將對象創建邏輯集中管理&#xff0c;提高代碼的可維護性和可擴展性。在 Java 中&#xff0c;工廠模式主要分為三種類型&#xff1a; 簡單工…

分布式定時任務:xxl-job

基礎 XXL - Job采用的是調度中心&#xff08;Scheduler&#xff09;與執行器&#xff08;Executor&#xff09;分離的架構設計&#xff0c;這種設計帶來了諸多優勢&#xff0c;比如高可用性、可擴展性以及便于分布式部署等。 1. 調度中心&#xff08;XXL - Job Admin&#xf…

易語言實現釘釘PC端高頻率鏈接批量打開系統

易語言實現釘釘PC端高頻率鏈接批量打開系統 一、需求分析與技術方案 核心需求: 在釘釘PC端私聊消息中嵌入特殊格式鏈接用戶點擊后通過自定義協議喚醒本地程序支持每分鐘處理10萬次請求的批量操作實現鏈接的批量生成和管理技術方案: #mermaid-svg-AYoMWYQQf71dlyEF {font-fa…