RabbitMQ---TTL與死信

(一)TTL

1.TTL概念

?TTL又叫過期時間

RabbitMQ可以對隊列和消息設置TTL,當消息到達過期時間還沒有被消費時就會自動刪除

注:這里我們說的對隊列設置TTL,是對隊列上的消息設置TTL并不是對隊列本身,不是說隊列過期時間到了,隊列被刪除,而是消息到達此隊列后會給他設定一個過期時間,這個時間到了,消息會刪除,不是隊列刪除(如果同時此消息本身帶有TTL過期時間,按短的來)

2.設置消息的TTL

? 那我們說可以對隊列和消息設置TTL

? 那我們現在來先寫對每條消息設置TTL(就是針對每一條消息設置消息的expiration參數,單位是毫秒)

那我們來看生產者代碼(這里配置文件不需要去更改)

@RequestMapping("ttl")public String TTLPro(){String s1="ttl test";Message message=new Message(s1.getBytes(StandardCharsets.UTF_8));message.getMessageProperties().setExpiration("10000");RabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE,"ttl",message);return "發送成功";}

? 我們來看現象,我這里設置過期時間為10s,按理說到達隊列后,如果10s鐘還沒有被消費掉,就會自動過期?

10s后?

?如果我們不設置TTL就表示消息不會過期,如果設置為0的化,就表示除非此時可以直接將消息給消費者,否者就會被丟棄

?3.設置隊列的TTL

? 設置隊列的TTL是比較簡單的,但是注意,我們隊列如果存在的話,我們是不可以直接改代碼,然后更改隊列的配置信息的,同時交換機也是這樣,如果我們想改,可以再聲明個隊列,或者把隊列先刪了再創建(此時隊列上的消息會丟失)

設置隊列過期時間,只需要在隊列上配置ttl屬性就可以,我這里設置了5s

此時我們隊列的特性就又多了個TTL?

?然后我們繼續向接口發送消息

5s后就變成了(真的是5s 騙人是g)

4.兩者區別?

?設置隊列TTL屬性的方法,一旦消息過期,就會立即從隊列中刪除

?設置消息TTL的方法,一旦消息過期(且不是隊列中第一個消息),消息并不會立即刪除,而是在要發送給消費者之前進行判定,如果過期了再刪

?那我們就有疑問了,這是為什么呢?? ?本質上,是為了提高性能,因為設置隊列的過期時間,他們消息的最長存在時間就是隊列的過期時間,所有消息的存在時間都小于等于隊列過期時間,所以此時隊列中已過期的元素大部分都在隊列頭部,RabbitMQ只需要定期從隊頭開始掃描是否有過期消息即可

? 而設置消息TTL,每條消息的過期時間都不同,如果想要刪除所有過期時間,就需要掃描整個隊列,很影響性能,所以不如等到用到了此消息,再判定是否過期,如果過期了再刪除

(二)死信

1.死信概念

?死信就是因為一些原因(包括消息過期,消息被拒絕接收,隊列達到最大長度)無法被消費的消息。

?那既然有這些無法被處理的信息,那一定就有存儲他們的隊列,有隊列就要有交換機,那么這個隊列就叫做死信隊列(DLQ),這個交換機就叫死信交換機(DLX)

?本質上與正常的交換機和隊列沒什么區別

消息變成死信后,會被發送到死信交換機,然后由死信交換機綁定到死信隊列中

2.代碼演示

首先我們要聲明一個死信隊列和死信交換機進行綁定,哪至于正常的隊列,我們就用剛剛的TTL為5的隊列吧

   @Bean("ttlExchange")public Exchange ttlExchange(){return ExchangeBuilder.directExchange(Constants.TTL_EXCHANGE).durable(true).build();}@Bean("ttlQueue")public Queue ttlQueue(){return QueueBuilder.durable(Constants.TTL_QUEUE).ttl(5000).deadLetterExchange(Constants.DEAD_EXCHANGE).deadLetterRoutingKey("dead").build();}@Bean("ttlBind")public Binding ttlBind(@Qualifier("ttlExchange") Exchange ackExchange,@Qualifier("ttlQueue") Queue queue){return BindingBuilder.bind(queue).to(ackExchange).with("ttl").noargs();}@Bean("deadExchange")public Exchange deadExchange(){return ExchangeBuilder.directExchange(Constants.DEAD_EXCHANGE).durable(true).build();}@Bean("deadQueue")public Queue deadQueue(){return QueueBuilder.durable(Constants.DEAD_QUEUE).build();}@Bean("deadBind")public Binding deadBind(@Qualifier("deadExchange") Exchange ackExchange,@Qualifier("deadQueue") Queue queue){return BindingBuilder.bind(queue).to(ackExchange).with("dead").noargs();}

然后我們發送消息等待5s看一下

?

然后我們看看剛才綁定死信交換機的那個隊列特征?

我們發現又多了兩個特征

那驗證完TTL過后,我們來看消息被拒絕的情況

首先我們要把消息確認模式改成手動確認,然后拒絕接收消息

 @RabbitListener(queues = Constants.TTL_QUEUE)public void ListenerQueue2(Message message,Channel channel) throws IOException {long Tag=message.getMessageProperties().getDeliveryTag();try {System.out.println("接收到消息: "+ new String(message.getBody())+" TagID: "+Tag);int num=3/0;     //模擬失敗channel.basicAck(Tag,false);System.out.println("處理完成");}catch (Exception e){channel.basicReject(Tag,false);}}

然后我們調用接口,看死信隊列,我們發現確實多了一條死信消息?

?

那第三種產生死信的消息是,隊列滿了,那我們就需要更改一下我們隊列?

@Bean("ttlQueue")public Queue ttlQueue(){return QueueBuilder.durable(Constants.TTL_QUEUE).ttl(5000).deadLetterExchange(Constants.DEAD_EXCHANGE).deadLetterRoutingKey("dead").maxLength(5l).build();}

?

此時我們注意我們要的是long類型,如果傳錯了會給我們報錯的

那我們再來看這個隊列

?我們發現又多了一個特征

我們到此已經給隊列設置5個特征了,我們來分別看一下

1)D:設置隊列為持久化的

2)TTL:設置隊列的過期時間

3)Lim:設置隊列的最大長度

4)DLX:設置了死信交換機

5)DLK:設置了死信RoutingKey

3.死信面試題

死信概念,死信來源,死信場景

前兩個我們都說過了,這里主要說一下死信的應用場景

比如我們用戶支付訂單,支付系統會給我們訂單系統返回當前訂單的支付狀態

?為了保障支付信息不丟失,需要使用死信隊列機制,當消息消費異常時,會放到死信隊列中(有可能存在用戶支付,但是消息沒有被消費或者異常拒絕的情況),此時我們放到死信隊列中,再對這個數據進行處理(可能是人工確認)

還有一些應用場景包括:

消息丟棄,直接丟棄這些無法處理的消息,避免他們占用系統資源

日志收集:將死信消息作為日志收集,用于后續分析和定位

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

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

相關文章

先進制造aps專題二十七 西門子opcenter aps架構分析

歐美的商業aps,主要就是sap apo,西門子opcenter aps,達索quintiq 從技術的層面,西門子aps是不如sap apo的,但是西門子aps是西門子數字化工廠產品的核心,有很多特色,所以分析 西門子aps主要分計劃器和排產器兩個部分 計…

WPF如何跨線程更新界面

WPF如何跨線程更新界面 在WPF中,類似于WinForms,UI控件只能在UI線程(即主線程)上進行更新。WPF通過Dispatcher機制提供了跨線程更新UI的方式。由于WPF的界面基于Dispatcher線程模型,當你在非UI線程(例如后…

ingress-nginx代理tcp使其能外部訪問mysql

一、helm部署mysql主從復制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解壓后編輯values.yaml文件,修改如下(storageclass已設置默認類) 117 ## param architecture MySQL archit…

macOS Sequoia 15.3 beta3(24D5055b)發布,附黑、白蘋果鏡像下載地址

“ 鏡像(黑蘋果引導鏡像、白蘋果Mac鏡像、黑蘋果虛擬機鏡像)下載地址:黑果魏叔官網。” 關于macOS Sequoia 15.3 beta3(24D5055b),以下是對其的詳細介紹: 一、版本發布信息 發布時間 &#xf…

豪越科技消防一體化安全管控平臺:推動消防作訓模式智慧轉型

在當今數字化浪潮席卷全球的時代背景下,各行業都在積極尋求創新與變革,以提升工作效率、優化管理流程。消防行業作為保障社會安全的關鍵領域,其數字化轉型的需求尤為迫切。豪越科技的消防一體化安全管控平臺應運而生,為消防工作帶…

Tomcat下載配置

目錄 Win下載安裝 Mac下載安裝配置 Win 下載 直接從官網下載https://tomcat.apache.org/download-10.cgi 在圈住的位置點擊下載自己想要的版本 根據自己電腦下載64位或32位zip版本 安裝 Tomcat是綠色版,直接解壓到自己想放的位置即可 Mac 下載 官網 https://tomcat.ap…

1161 Merging Linked Lists (25)

Given two singly linked lists L1?a1?→a2?→?→an?1?→an? and L2?b1?→b2?→?→bm?1?→bm?. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1?→a2?→bm?→a3?→a4?→bm?1??. For ex…

【記錄】騰訊混元大模型本地部署過程

概述 本文記錄在本地部署騰訊混元大模型的過程。僅為部署記錄,不涉及過多的技術要點。 混元大模型主頁:https://github.com/Tencent/HunyuanVideo 該模型應該是當前開源的效果不錯的模型,其實官方文檔將部署過程寫的相當詳細了,但是這里為了便于后期的學習,特意將部署過程…

Go-知識 版本演進

Go-知識 版本演進 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具語言包工具小修訂 r58(2011/06/29)語言包工具小修訂 r59(2011/08/01)語言包工具 r60(2011/09/07)語言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

Java鎖 死鎖及排查 JVM 工具 jconsole 工具 排查死鎖

目錄 概述 死鎖案例 (面試) 如何排查死鎖 使用 JVM 工具排查死鎖 使用 jconsole 工具排查死鎖 細節 概述 死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力于涉那它們都將無法推進下去,如果系統資源充足,…

計算機網絡 (49)網絡安全問題概述

前言 計算機網絡安全問題是一個復雜且多維的領域,它涉及到網絡系統的硬件、軟件以及數據的安全保護,確保這些元素不因偶然的或惡意的原因而遭到破壞、更改或泄露。 一、計算機網絡安全的定義 計算機網絡安全是指利用網絡管理控制和技術措施,保…

CSS 合法顏色值

CSS 顏色 CSS 中的顏色可以通過以下方法指定: 十六進制顏色帶透明度的十六進制顏色RGB 顏色RGBA 顏色HSL 顏色HSLA 顏色預定義/跨瀏覽器的顏色名稱使用 currentcolor 關鍵字 十六進制顏色 用 #RRGGBB 規定十六進制顏色,其中 RR(紅色&…

C# 實現系統信息監控與獲取全解析

在 C# 開發的眾多應用場景中,獲取系統信息以及監控用戶操作有著廣泛的用途。比如在系統性能優化工具中,需要實時讀取 CPU、GPU 資源信息;在一些特殊的輸入記錄程序里,可能會涉及到鍵盤監控;而在圖形界面開發中&#xf…

使用docker-compose安裝ELK(elasticsearch,logstash,kibana)并簡單使用

首先服務器上需要安裝docker已經docker-compose,如果沒有,可以參考我之前寫的文章進行安裝。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下載并啟動elk容器 先創建一個網關,讓所有的容器共用此網…

二十四、NetworkPolicy

NetworkPolicy 一、基礎網路 Kubernetes網絡模型設計的一個基礎原則是:每個Pod都擁有一個獨立的IP地址,并假定所有Pod都在一個可以直接連通的、扁平的網絡空間中。所以不管它們是否運行在同一個Node(宿主機)中,都要求它們可以直接通過對方的IP進行訪問。設計這個原則的原…

Python Web應用開發入門:從零搭建一個簡單的Web應用

引言 在當今的互聯網時代,Web應用已經成為我們日常生活中不可或缺的一部分。無論是社交媒體、電子商務,還是在線教育,Web應用都在背后發揮著重要作用。Python作為一種簡潔、強大的編程語言,在Web開發領域也有著廣泛的應用。本文將帶你從零開始,使用Python搭建一個簡單的W…

Java操作Excel導入導出——POI、Hutool、EasyExcel

目錄 一、POI導入導出 1.數據庫導出為Excel文件 2.將Excel文件導入到數據庫中 二、Hutool導入導出 1.數據庫導出為Excel文件——屬性名是列名 2.數據庫導出為Excel文件——列名起別名 3.從Excel文件導入數據到數據庫——屬性名是列名 4.從Excel文件導入數據到數據庫…

下載文件,瀏覽器阻止不安全下載

背景: 在項目開發中,遇到需要下載文件的情況,文件類型可能是圖片、excell表、pdf、zip等文件類型,但瀏覽器會阻止不安全的下載鏈接。 效果展示: 下載文件的兩種方式: 一、根據接口的相對url,拼…

第15章:Python TDD應對貨幣類開發變化(二)

寫在前面 這本書是我們老板推薦過的,我在《價值心法》的推薦書單里也看到了它。用了一段時間 Cursor 軟件后,我突然思考,對于測試開發工程師來說,什么才更有價值呢?如何讓 AI 工具更好地輔助自己寫代碼,或許…

CSS 動畫相關屬性

定義和用法 一些 CSS 屬性可用于動畫制作,這意味著它們可用于過渡等效果中。 可設置動畫的屬性可以從一個值逐漸更改為另一個值,例如尺寸、數字、百分比和顏色。 瀏覽器支持 表格中的數字注明了完全支持 CSS 動畫的首個瀏覽器版本。 -webkit-、-moz…