RabbitMQ相關問題

Mybatis框架相關問題

RabbitMQ相關問題

  • 一、RabbitMQ的核心組件和工作原理?
  • 二、如何保證消息可靠投遞不丟失的?
  • 三、RabbitMQ如何保證消息的冪等性?
  • 四、什么是死信隊列?死信隊列是如何導致的?
  • 五、RabbitMQ死信隊列是如何導致的?
  • 六、什么是延遲隊列?RabbitMQ 如何實現延遲隊列?
  • 七、RabbitMQ的高可用機制有了解嘛?
  • 八、如果有百萬消息堆積在MQ中,如何解決?
  • 九、如何解決RabbitMQ中因為消息堆積而導致的消息過期失效的問題?

一、RabbitMQ的核心組件和工作原理?

在這里插入圖片描述
交換機有四類:
1、Fanout Exchange

投遞到所有綁定的隊列,不需要規則,不需要匹配,相當于廣播、群發;
在這里插入圖片描述
2、Direct Exchange

根據路由鍵精確匹配進行路由消息隊列;
在這里插入圖片描述
3、Topic Exchange

通配符匹配,相當于模糊匹配;

# 匹配多個單詞,* 匹配一個單詞,用 . 隔開的為一個單詞:

在這里插入圖片描述
4、Headers Exchange

基于消息內容中的headers屬性進行匹配;
在這里插入圖片描述

二、如何保證消息可靠投遞不丟失的?

在這里插入圖片描述
要確保一下四個步驟全部成功;
① 代表消息從生產者發送到Exchange;
② 代表消息從Exchange路由到Queue
③ 代表消息在Queue中存儲;
④ 代表消費者監聽Queue并消費消息;

  • ① 代表消息從生產者發送到Exchange;

    • 方案:開啟Confirm確認模式;
    • 消息未投遞成功,采取補償措施,或是記錄日志,或是發送通知讓負責人知道;
    // 實現接口
    implements RabbitTemplate.ConfirmCallback// 重寫方法
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause)
    
  • ② 代表消息從Exchange路由到Queue;

    • 方案:開啟Return返回模式;
    • 消息未投遞成功,采取補償措施,或是記錄日志,或是發送通知讓負責人知道;
    // 實現接口
    implements RabbitTemplate.ReturnsCallback/*** 消息從 交換機 --> 到 --> 隊列,如果失敗了,就會回調該方法* (失敗了才觸發該方法,成功是不會觸發該方法的)** 比如說磁盤滿** @param returned*/
    @Override
    public void returnedMessage(ReturnedMessage returned)
    
  • ③ 代表消息在Queue中存儲;

    • 方案:
      1、交換機持久化
          /*** 聲明創建一個FanoutExchange交換機** @return*/@Beanpublic DirectExchange directExchange() {return ExchangeBuilder.directExchange(DIRECT_EXCHANGE_NAME).durable(true) // 持久化.build();}
      
      2、隊列持久化
          /*** 聲明創建一個隊列** @return*/@Beanpublic Queue directQueue() {return QueueBuilder.durable(DIRECT_QUEUE_NAME).build();}
      
      3、消息持久化
      	//消息體Message message = MessageBuilder.withBody(json.getBytes(StandardCharsets.UTF_8)).setDeliveryMode(MessageDeliveryMode.PERSISTENT) //消息持久化.build();
      
      4、集群高可用部署
  • ④ 代表消費者監聽Queue并消費消息;

    • 方案:手動確認消息
    @Slf4j
    @Component
    public class MyRabbitListener {@RabbitListener(queues = {RabbitConfig.DIRECT_QUEUE_NAME})public void onMessage(String msg, @Headers Map<String, Object> header, Message message, Channel channel) {try {System.out.println("[RabbitListener]接收到的消息: " + msg);//處理業務//業務處理成功,手動確認消息channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);//業務處理失效,不確認消息,并且重新入隊,這樣又可以重新消費// channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);//拒絕消息// channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {e.printStackTrace();}}
    }
    

三、RabbitMQ如何保證消息的冪等性?

冪等性:多次操作,重復操作,對系統不會造成影響; 比如:消息重復發送兩次或多次,消息重復消費兩次或多次;

保證MQ的冪等性,只要保證消費者不會重復消費相同的消息即可;

  • 方案:
    • 生產者發送消息時,為每條消息設置一個全局唯一的id
    • 消費者消費消息時,使用 redis 的 setnx 命令:SET id 1 NX,若返回OK,說明該消息之前沒有消費過,正常消費;若返回 nil,說明該消息之前已消費過,那就不用處理;

四、什么是死信隊列?死信隊列是如何導致的?

死信隊列即DLX,全稱為Dead-Letter-Exchange,翻譯為:死信交換機。當一個消息在隊列中變成死信 (dead message) 之后,它能被重新發送到另外一個交換機中,這個交換機就是DLX,綁定到DLX的隊列就稱為死信隊列;

死信隊列本身也是一個普通的消息隊列,可以通過設置一些參數將其設置為死信隊列;

死信隊列是一個用于存放無法被消費的消息的隊列,這些消息被稱為死信,死信隊列可以避免消息一直被消費卻無法消費成功的情況;

在這里插入圖片描述

五、RabbitMQ死信隊列是如何導致的?

RabbitMQ導致死信的幾種原因:
1、消息被拒

  • Basic.Nack 且 requeue = false
  • Basic.Reject 且 requeue = false

2、消息 TTL 過期;
3、隊列達到最大長度,即隊列滿了;

在這里插入圖片描述

六、什么是延遲隊列?RabbitMQ 如何實現延遲隊列?

  • 延遲隊列是用來存放“延遲消息”的隊列;
  • 所謂“延遲消息”是指消息被發送到隊列以后,并不想讓消費者立刻拿到消息,而是等待指定的時間后,消費者才能拿到這個消息;

RabbitMQ 本身是沒有直接可以使用的延遲隊列;要實現延遲隊列,一般有兩種方式:

  • 使用TTL消息過期 + DLX死信隊列來實現;
    在這里插入圖片描述

  • 使用使用 rabbitmq-delayed-message-exchange 延遲插件來實現;
    在這里插入圖片描述

七、RabbitMQ的高可用機制有了解嘛?

RabbitMQ有三種模式:
1)單機模式
2)普通集群模式
在這里插入圖片描述

3)鏡像集群模式 (高可用)
在這里插入圖片描述

八、如果有百萬消息堆積在MQ中,如何解決?

在這里插入圖片描述

  • 原因:生產和消費失衡;
  • 解決:

1、提前預防;

  • 流量預估,預估每秒產生的消息數量;
  • 做好壓測,壓測系統的消費能力;
  • 做好預案,準備好可能發生的超出預估的突發情況;

2、應急處理;

  • 消費端
    • 臨時增加消費者數量:增加更多的消費者實例、增加消費者線程數量;
    • 臨時增加消費者把消息寫入其他設備,后續處理;
  • 生產端
    • 可以適當限流,降低消息發送速度;

3、事后優化;

  • 優化消費端業務處理邏輯,提升業務執行效率,減少io操作,減少數據庫操作,減少網絡連接,業務異步處理等;

九、如何解決RabbitMQ中因為消息堆積而導致的消息過期失效的問題?

消息堆積,導致消息大量存儲在消息隊列中得不到消費,而消息又設置了TTL過期時間,當到達過期時間時,消息被過期丟棄;

解決:
1、讓消息不要被堆積;
2、不設置TTL過期時間或者增加過期時間時長;
3、設置死信隊列
4、編寫臨時程序補發消息;

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

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

相關文章

面向對象知識點--全學習內容(day20)階段測試題見資料

面向對象 一、初識面向對象 見文件資料的面向對象.md 全內容梳理 類與實體概念 現實生活&#xff1a; ? 類&#xff1a;抽象的概念&#xff0c;把具有相同特征和操作的事物歸為一類 ? 先有實體&#xff0c;再有類的概念 代碼世界&#xff1a; ? 類&#xff1a;抽象的概念&a…

java.lang.NoClassDefFoundError: lombok/Data報錯問題.

今天拉取一個git代碼&#xff0c;啟動后報錯&#xff1a;java.lang.NoClassDefFoundError: lombok/Data 檢查以后&#xff0c;發現是因為屬性上使用了Data&#xff0c;引用的是lombok.Data的包造成的。 可以看到這個類中有一個好幾個Data。這里就很嚴重了&#xff0c;造成這個…

回溯 Leetcode 332 重新安排行程

重新安排行程 Leetcode 332 學習記錄自代碼隨想錄 給你一份航線列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飛機出發和降落的機場地點。請你對該行程進行重新規劃排序。 所有這些機票都屬于一個從 JFK&#xff08;肯尼迪國際機場&#xff09;出發的先生&a…

【Datawhale組隊學習:Sora原理與技術實戰】Attention

Attention Attention 注意力&#xff0c;從兩個不同的主體開始。 論文&#xff1a;https://arxiv.org/pdf/1703.03906.pdf seq2seq代碼倉&#xff1a;https://github.com/google/seq2seq 計算方法&#xff1a; 加性Attention&#xff0c;如&#xff08;Bahdanau attention&…

【工商業儲能如何選】Acrel工商業儲能系統解決方案

市場前景 碳中和&#xff1a;全球應對氣候危機重建人與自然和諧關系的共同目標 清潔替代&#xff1a;清潔能源替代化石能源是全球實現碳中和的唯一路徑 能量存儲&#xff1a;儲能技術是解決大比例清潔能源時空分布不平衡的最佳方案 應用場景 隨著“雙碳”目標下的新型電力…

Python+Selenium使用Page Object實現頁面自動化測試

Page Object模式是Selenium中的一種測試設計模式&#xff0c;主要是將每一個頁面設計為一個Class&#xff0c;其中包含頁面中需要測試的元素&#xff08;按鈕&#xff0c;輸入框&#xff0c;標題 等&#xff09;&#xff0c;這樣在Selenium測試頁面中可以通過調用頁面類來獲取頁…

記一次:android學習筆記一(學習目錄-不要看無內容)

學習目錄如下 B站學習的名稱--Android開發從入門到精通(項目案例版) 網址:https://www.bilibili.com/video/BV1jW411375J/ 第0章:安裝 android stoid 參考地址https://blog.csdn.net/adminstate/article/details/130542368 第一章:第一個安卓應用 第二章:用戶界面設…

idea插件開發的時候找不到com.intellij.psi.PsiClass

最近在使用idea上傳接口帶yapi(可視化管理平臺)時遇到com.intellij.psi.PsiClass&#xff0c;在網上看了找到幾種解決方案&#xff0c;這里總結記錄一下&#xff1a; 方法一&#xff1a;在 build.gradle 中的 intellij plugins屬性添加 ‘java’ intellij {version 2020.X.Xpl…

直接修改zynq petalinux編譯出來的rootfs.cpio.gz文件內容

xilinx zynq petalinux 默認編譯打包出的SPI flash燒寫啟動文件是BOOT.BIN&#xff0c;然而每次需要修改rootfs內的文件時都要重新build rootfs 然后再 package一次才能生成新的BOOT.bin文件&#xff0c;地球人都知道petalinux編譯一次是很耗時間的&#xff0c;那么有沒有什么簡…

OpenCV 4基礎篇| OpenCV圖像的拆分和合并

目錄 1. 通道拆分1.1 cv2.split1.1.1 語法結構1.1.2 注意事項1.1.3 代碼示例 1.2 NumPy切片1.2.1 代碼示例 2. 通道合并2.1 cv2.merge2.1.1 語法結構2.1.2 注意事項2.1.3 代碼示例 1. 通道拆分 1.1 cv2.split 1.1.1 語法結構 b,g,r cv2.split(img[, mv]) #圖像拆分為 BGR 通…

【開發工具】GIF 錄屏工具推薦 ( GIF123 - 推薦使用 | GifCam | LICEcap )

文章目錄 一、GIF 錄屏工具推薦1、GIF123 ( 推薦使用 )2、GifCam3、LICEcap 本博客中介紹的 3 款 GIF 錄屏工具下載地址 : https://download.csdn.net/download/han1202012/88905642 也可以到對應的官網獨立下載 : GIF123 : https://gif123.aardio.com/ ;GifCam : https://bl…

FAST-LIO系列-閱讀筆記

近期&#xff0c;閱讀了FAST-LIO、FAST-LIO2以及Faster_LIO論文&#xff0c;這三篇論文都屬于濾波器的SLAM算法&#xff0c;下面記錄一下三個工作的主要貢獻和不同。 FAST-LIO 1.提出了一種計算效率高、魯棒性強的激光雷達-慣性里程測量框架。使用緊密耦合的迭代擴展卡爾曼濾…

報錯:/bin/sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8)

解釋&#xff1a;這是shell 警告你無法將當前的區域設置&#xff08;locale&#xff09;更改為 zh_CN.UTF-8&#xff0c;這個警告可能不會影響 fc-cache 命令的實際運行&#xff0c;但它確實表明系統在某些方面可能無法正確地處理與 zh_CN.UTF-8 相關的內容。 1.檢查當前的區域…

2024年口腔護理市場行業未來前景預測:正畸護理用品市場行業分析報告

口腔護理是維護口腔健康的重要步驟&#xff0c;近年來&#xff0c;隨著大眾口腔健康意識的不斷增強&#xff0c;人們對于口腔護理的消費意愿也不斷增加&#xff0c;由此&#xff0c;口腔護理市場的市場規模也比較大。 根據鯨參謀電商數據分析平臺的相關數據顯示&#xff0c;20…

OSCP靶場--Walla

OSCP靶場–Walla 考點(1.hydra http基本認證爆破&#xff1a; 2.sudo -l&#xff1a;python導入外部模塊提權 3.Linux內核提權&#xff1a;cve-2021-4034) 1.nmap掃描 ## ┌──(root?kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.181.97 --min-rate 2000 Starting N…

Linux網絡編程:Socket套接字

一、socket地址API 1、主機字節序和網絡字節序 小端字節序&#xff08;主機字節序&#xff09;是指一個整數的高位字節存儲在內存的高地址處 大端字節序&#xff08;網絡字節序&#xff09;是指一個整數的高位字節存儲在內存的低地址處 判斷機器字節序 #include <stdio.…

RT-DETR算法優化改進: 特征融合漲點篇 | 廣義高效層聚合網絡(GELAN) | YOLOv9

??????本文獨家改進:即結合用梯度路徑規劃(CSPNet)和(ELAN)設計了一種廣義的高效層聚合網絡(GELAN),高效結合RT-DETR,實現漲點。 ??????在多個私有數據集和公開數據集VisDrone2019、PASCAL VOC實現漲點 RT-DETR魔術師專欄介紹: https://blog.csdn.net/…

使用postman測試若依登錄接口API-2

請求方式 由于登錄控制器可知&#xff1a;該請求方式為Post請求 請求地址 在請求路徑欄輸入請求地址&#xff0c;如下圖所示&#xff1a; 參數體 在Body鍵入所需參數&#xff0c;類型選擇raw,數據格式選擇"JSON"&#xff1a;如下圖所示&#xff1a; 認證成功與失敗…

解釋存儲過程和函數的區別,以及它們在MySQL中的用途。如何創建和使用存儲過程和函數?

解釋存儲過程和函數的區別&#xff0c;以及它們在MySQL中的用途。 存儲過程和函數在MySQL中的區別及用途 區別&#xff1a; 返回值&#xff1a; 函數&#xff1a;必須有一個返回值&#xff0c;這可以是一個標量值或一個表。如果沒有明確的RETURN語句&#xff0c;函數將返回N…

香桿箐騎行記,春回大地

2024年3月2日春回大地之際我們校長騎行群再次踏上征程前往香桿箐。這次騎行不僅是一次對身體的鍛煉更是一次心靈的洗禮。 清晨的陽光灑滿大地我們從郊野公園后門出發踏上了前往香桿箐的道路。沿途的風景如畫綠樹成蔭鮮花盛開讓人心曠神怡。我們沿著山路蜿蜒前行感受著大自然的韻…