RabbitMQ 重試機制 和 TTL

目錄

1. 重試機制

1.1 簡介

1.2 配置文件?

1.3 消費者確認機制為 auto 時

1.4 消費者確認機制為 manual 時

2. TTL

2.1 設置消息的過期時間

2.2 設置隊列的過期時間

2.3 給過期隊列中消息設置過期時間


1. 重試機制

1.1 簡介

在消息傳遞過程中, 可能會遇到各種問題, 如網絡故障, 服務不可用, 資源不足... 這些問題可能導致消息處理失敗. 為了解決這些問題, RabbitMQ 提供了重試機制, 允許消息在處理失敗后重新發送. 但如果是程序邏輯引起的錯誤, 那么多次重試也是沒有用的, 可以設置重試次數.

1.2 配置文件?

spring:application:name: rabbitmq-extensions-demorabbitmq:addresses: amqp://study:study@192.168.100.10:5672/extensionlistener:simple:
#        acknowledge-mode: noneacknowledge-mode: auto
#        acknowledge-mode: manualretry:enabled: true # 開啟消費者失敗重試initial-interval: 5000ms # 初始失敗等待時長為5秒max-attempts: 5 # 最大重試次數
    //重試機制@Bean("retryQueue")public Queue retryQueue(){return QueueBuilder.durable(Constants.RETRY_QUEUE).build();}@Bean("retryExchange")public DirectExchange retryExchange(){return ExchangeBuilder.directExchange(Constants.RETRY_EXCHANGE).build();}@Bean("retryBinding")public Binding retryBinding(@Qualifier("retryQueue") Queue queue, @Qualifier("retryExchange") Exchange exchange){return BindingBuilder.bind(queue).to(exchange).with("retry").noargs();}

1.3 消費者確認機制為 auto 時

如果程序邏輯錯誤, 那么就會不斷重試, 造成消息積壓. 因此我們就需要設置重試次數, 當多次重試還是失敗, 消息就會被自動確認, 自然消息就會丟失 (這里可以弄個死信隊列, 來存儲這些丟失的消息)

生產者 :?

    @RequestMapping("/retry")public String retry() {System.out.println("retry...");rabbitTemplate.convertAndSend(Constants.RETRY_EXCHANGE, "retry", "retry test...");return "消息發送成功";}

消費者 :?

@Component
public class RetryListener {@RabbitListener(queues = Constants.RETRY_QUEUE)public void handlerMessage(Message message) throws UnsupportedEncodingException {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.printf("[" + Constants.RETRY_QUEUE + "]接收到消息: %s, deliveryTag: %s \n",new String(message.getBody(), StandardCharsets.UTF_8), deliveryTag);int num = 3/0;System.out.println("業務處理完成");}
}

由于消費者代碼邏輯錯誤, 消息重發機制觸發了 4 次, 一共發了 5 次, 日志中, 每次的 deliverTag 都一樣, 表示發送的是同一個消息.??

查看隊列中消息也已經被刪除.

1.4 消費者確認機制為 manual 時

更改消費者 :?

    @RabbitListener(queues = Constants.RETRY_QUEUE)public void handlerMessage(Message message, Channel channel) throws Exception {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.printf("[" + Constants.RETRY_QUEUE + "]接收到消息: %s, deliveryTag: %s \n",new String(message.getBody(), StandardCharsets.UTF_8), deliveryTag);try {int num = 3/0;System.out.println("業務處理完成");channel.basicAck(deliveryTag, false);}catch (Exception e){// 不成功消息重新入隊列channel.basicNack(deliveryTag, false, true);}}

這里我們發現, 雖然我們設置了重試機制, 但是 deliveryTag 還是在不斷更新... 隊列中的消息也不會消失. 原因是手動模式下, 消費者需要顯示的對消息進行確認, 如果消費者在消息處理過程中遇到異常, 可以選擇確認, 不確認消息,也可以選擇重新入隊. 所以重試的控制權不在應用程序本身, 而在于代碼邏輯本身.

  • 消費者確認機制為 AUTO 時, 如果程序邏輯異常, 多次重試還是失敗. 那么消息就會自動確認, 進而消息就會丟失.
  • 消費者確認機制為 MANAUL 時, 如果程序邏輯異常, 多次重試依然處理失敗, 無法被確認, 消息就會積壓.
  • 消費者確認機制為 NONE 時, 不管發生什么情況, 當消息從 Broker 內部發出時, 就會自動確認, 因此它不存在任何內容

2. TTL

TTL -> time to live, 指的是過期時間.

  • 給消息設置過期時間 : 當消息到達過期時間, 還沒有被消費, 就會被自動清除.
  • 給隊列設置過期時間 :? 就相當于給隊列的所有消息設置了一個過期時間, 這消息的過期時間與隊列的過期時間是相同的. 從消息入隊列開始算起, 經過這個時間, 就會被刪除

2.1 設置消息的過期時間

    @Bean("ttlQueue")public Queue ttlQueue(){return QueueBuilder.durable(Constants.TTL_QUEUE).build();}@Bean("ttlExchange")public DirectExchange ttlExchange(){return ExchangeBuilder.directExchange(Constants.TTL_EXCHANGE).build();}@Bean("ttlBinding")public Binding ttlBinding(@Qualifier("ttlQueue") Queue queue, @Qualifier("ttlExchange") Exchange exchange){return BindingBuilder.bind(queue).to(exchange).with("ttl").noargs();}
    @RequestMapping("/ttl")public String ttl() {System.out.println("ttl...");MessagePostProcessor messageInfo = new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setExpiration("30000"); //單位: 毫秒, 過期時間為30sreturn message;}};rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE, "ttl", "ttl test 30s", messageInfo);rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE, "ttl", "ttl test 10s...", message -> {message.getMessageProperties().setExpiration("10000");  //單位: 毫秒, 過期時間為10sreturn message;});return "消息發送成功";}

不需要消費者, 不然看不到消息在隊列中的自動刪除.

2.2 設置隊列的過期時間

    //設置ttl@Bean("ttlQueue2")public Queue ttlQueue2(){return QueueBuilder.durable(Constants.TTL_QUEUE2).ttl(20000).build();  //設置隊列的ttl為20s}@Bean("ttlBinding2")public Binding ttlBinding2(@Qualifier("ttlQueue2") Queue queue, @Qualifier("ttlExchange") Exchange exchange){return BindingBuilder.bind(queue).to(exchange).with("ttl").noargs();}
    @RequestMapping("/ttl2")public String ttl2() {System.out.println("ttl2...");//發送普通消息rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE, "ttl", "ttl test...");return "消息發送成功";}

我們發現了消息經過 20 秒后被刪除了, 但是隊列沒有被刪除, 說明過期隊列是給消息上過期時間的. 這個隊列也有 TTL 的標志了.

2.3 給過期隊列中消息設置過期時間

如果兩種方法同時使用, 那么就以過期時間較小的值為準.

設置隊列的過期時間, 一旦消息過期, 就會從隊列中刪除.

設置消息的過期時間, 即使消息過期, 如果消息不在隊首, 還得等到消息到達隊首之后才會進行判定是否過期. 如果過期, 那就刪除, 反之就投遞到相應的消費者中.

為什么這兩種方法處理的方式不一樣?

因為設置隊列的過期時間, 那么隊列中過期的消息一定在隊首, RabbitMQ 只需要定期從隊首掃描消息是否有過期的消息即可, 而設置消息的過期時間, 每條消息的過期時間都不一致, 如果要刪除隊列的所有過期消息那么就要掃描整個隊列, 所以不如等到消息要進行投遞時再判斷消息是否過期, 這樣可以減少一定的資源消耗.

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

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

相關文章

四、FVP啟動linux

目錄 1 實驗目的及環境 1.1 實驗目的 1.2 實驗環境 1.2.1 拉取代碼 1.2.2搭建交叉編譯環境 2 相關鏡像編譯 2.1 TF-A鏡像編譯 2.2 U-Boot鏡像編譯 2.3 Linux Kernel鏡像編譯 2.4 構建跟文件系統 3 啟動linux內核 3.1 啟動腳本構建 3.2 啟動Linux內核 1 實驗目的及環境 1.1 實驗…

淺聊一下微服務的服務保護

在微服務架構里,服務間調用關系錯綜復雜,一個服務出問題很可能引發連鎖反應,也就是 “雪崩”。今天就帶大家從零開始學習 Sentinel,這款阿里開源的微服務保護工具,幫你解決雪崩難題,做好流量控制、隔離降級…

ECharts Gallery:Apache官方數據可視化模板庫,助你快速制作交互圖表并實現深度定制

你有沒有過這種時候?手里攥著一堆 Excel 數據,想做個直觀的圖表給同事看,用 Excel 自帶的圖表吧,樣式丑不說,稍微復雜點的交互(比如點擊柱子顯示詳情)根本做不了;想自己用代碼寫吧&a…

[數據結構——lesson3.單鏈表]

目錄 引言 學習目標: 1.什么是鏈表 2.鏈表的分類 2.1 單向鏈表和雙向鏈表 (1)單向鏈表 (2)雙向鏈表 2.2 帶頭結點鏈表和不帶頭結點鏈表 (1)帶頭結點鏈表 (2)不帶頭結點鏈表 2.3 循環鏈表和不循環鏈表 (1)循環鏈表 (2)非循環鏈表 3.鏈表的實…

從零深入理解嵌入式OTA升級:Bootloader、IAP與升級流程全解析

引言(Opening)想象一下,你開發的一款智能水杯、一個環境監測設備或者一臺共享充電寶,已經部署到了成千上萬的用戶手中。突然,你發現了一個軟件bug,或者需要增加一個酷炫的新功能。你不可能派人跑到每個設備…

【Ansible】實施 Ansible Playbook知識點

1.清單概念與靜態清單文件是什么?答:Ansible 清單是被管理主機的列表,用于明確Ansible的管理范圍,分為靜態清單和動態清單。靜態清單是通過手動編輯的文本文件來定義被管主機,文件格式可以是INI格式或YAML格式。在INI格…

【Linux】vim工具篇

目錄一、vim的多模式1.1 命令模式1.1.1 光標移動1.1.2 復制及撤銷1.1.3 剪切及刪除1.1.4 替換1.1.5 批量化注釋/去注釋1.2 底行模式二、vim的配置個人主頁<—請點擊 Linux專欄<—請點擊 一、vim的多模式 vim是一款功能強大的文本編輯器&#xff0c;它編輯代碼主要圍繞命…

Spark 核心原理:RDD, DataFrame, DataSet 的深度解析

Apache Spark 是一個強大的分布式計算系統&#xff0c;以其內存計算、速度快、易用性強等特點&#xff0c;在大數據處理領域占據重要地位。理解 Spark 的核心原理&#xff0c;特別是其三種核心抽象——RDD, DataFrame, DataSet——對于高效地使用 Spark 至關重要。本文將深入解…

Docker 命令行的使用

1.Docker 命令列表[roothost1 ~]# docker Usage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run Create and run a new container from an imageexec Execute a command in a running containerps List cont…

Redis Stream:輕量級消息隊列深度解析

&#x1f4e8; Redis Stream&#xff1a;輕量級消息隊列深度解析 文章目錄&#x1f4e8; Redis Stream&#xff1a;輕量級消息隊列深度解析&#x1f9e0; 一、Stream 數據結構解析&#x1f4a1; Stream 核心概念&#x1f4cb; Stream 底層結構? 二、消息生產與消費&#x1f68…

Android studio的adb和終端的adb互相搶占端口

在Android Studio調試時&#xff0c;有時候也需要借助終端的adb命令&#xff0c;他們互相搶占端 口&#xff0c;導致調試麻煩解決如下&#xff1a;① 終端adb的版本是&#xff1a;1.0.39路徑是:/usr/lib/android-sdk/platform-tools/adb② Android Studio使用的adb來源于Androi…

GEO服務商推薦:移山科技以劃時代高精尖技術引領AI搜索優化新紀元

引言&#xff1a;AI搜索生態重塑與GEO優化戰略地位躍升AI技術對信息檢索范式的顛覆GEO優化在企業增長中的核心作用第一章&#xff1a;AI搜索新紀元的企業營銷挑戰與機遇生成式AI成為用戶主要信息入口的行業趨勢企業在AI搜索中的“答案主權”爭奪戰GEO優化服務商的核心能力模型&…

Android SystemServer 系列專題【AttentionManagerService】

AttentionManagerService是framework中用來實現屏幕感知的一個系統級服務&#xff0c;他繼承于systemserver。我們可以通過dumpsys attention來獲取他的一些信息。如下針對屏幕感知的功能的引入來針對這個服務進行一個介紹。1、屏幕感知Settings UI實現屏幕感知的功能在A14上面…

nginx 反向代理使用變量的坑

nginx采用反向代理的時候使用變量的坑 正常情況&#xff1a; location ~ ^/prod-api(?<rest>/.*)?$ {# 假設 $mes_backend 形如: http://127.0.0.1:16889proxy_pass $mes_backend$rest$is_args$args;proxy_http_version 1.1;proxy_set_header Host $host;…

Origin繪制徑向條形圖|科研論文圖表教程

數據排列格式截圖&#xff0c;請查看每張圖↘右下角水印 目錄 數據排列格式截圖&#xff0c;請查看每張圖↘右下角水印 本 期 導 讀 No.1 理解圖形 1 定義 2 特點 3 適用場景 No.2 畫圖教程 1 導入數據&#xff0c;繪制圖形 2 設置繪圖細節 本 期 導 讀 徑…

MySQL InnoDB 的 MVCC 機制

前言 多版本并發控制&#xff08;MVCC&#xff09;是 MySQL InnoDB 存儲引擎實現高性能事務的核心機制。它通過創建數據快照&#xff0c;使得讀寫操作可以無鎖并發&#xff0c;極大地提升了數據庫的并發性能。本文將深入探討 MVCC 的工作原理、實現細節以及它與事務隔離級別的緊…

景區負氧離子氣象站:引領綠色旅游,暢吸清新每一刻

在綠色旅游成為消費主流的今天&#xff0c;游客對 “清新空氣” 的需求不再是模糊的期待&#xff0c;而是可感知、可選擇的具體體驗。景區負氧離子氣象站的出現&#xff0c;正以科技之力重塑綠色旅游格局&#xff0c;讓 “暢吸清新每一刻” 從口號變為觸手可及的現實&#xff0…

Pytorch筆記一之 cpu模型保存、加載與推理

Pytorch筆記一之 cpu模型保存、加載與推理 1.保存模型 首先&#xff0c;在加載模型之前&#xff0c;我們需要了解如何保存模型。PyTorch 提供了兩種保存模型的方法&#xff1a;保存整個模型和僅保存模型的狀態字典&#xff08;state dict&#xff09;。推薦使用第二種方式&…

當AI在代碼車間組裝模塊:初級開發者的創意反成「核心算法」

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄當AI在…

技術視界 | 跨域機器人通信與智能系統:打破壁壘的開源探索

8 月 16 日&#xff0c;在 OpenLoong 社區舉辦的第九期線下分享會上&#xff0c;國家地方共建人形機器人創新中心的軟件開發負責人 Amadeus 博士帶來了一場主題為“跨域機器人通信與智能系統&#xff1a;打破行業壁壘的創新方案”的演講。深入探討了當前機器人領域的一個關鍵痛…