八股訓練--RabbitMQ

一、經典問題

1.為什么要用MQ?

MQ的作用主要是3個,

? 第一個是流量削峰:當某個活動舉行時,訪問量可能是平時的幾百倍,可能一下會把服務器弄崩潰,所以通過MQ的形式,引入中間者,客戶端將請求都發到MQ這里,服務器根據自身的容量去MQ中取請求進行處理,這樣起了流量削峰的作用。

? 第二個是應用解耦:當一個應用中有許多系統,訂單系統,庫存系統,支付系統等,任何一個子系統出現了故障,都會造成下單操作的故障,引入了MQ之后,一個子系統故障了,另外的子系統仍然可以進行相應的操作。

? 第三個是異步處理:當A調用了B方法之后,B方法要執行很久,但A還有許多方法還要執行,就可以使用MQ進行異步的方式執行B方法,A繼續執行其他方法,之后B方法執行完成之后就通知A一次,就節省了運行時間。

2.常見MQ的區別

區別RabbitMQRocketMQKafKa
語言ErlangJavaScala & Java
支持語言

幾乎支持所有語言

Java,C++不成熟多種語言
單機吞吐量萬級3十萬級1十萬級2
消息延遲微秒級毫秒級毫秒以內
可用性高,基于主從架構非常高,分布式結構非常高,分布式結構,一個數據多個副本
消息可靠性? -?可以做到零丟失可以做到零丟失
優勢支持所有語言,吞吐量萬級,功能齊全接口簡單易用,吞吐量大,分布式使用方便超高吞吐量,ms的延遲,可用性有保障
劣勢吞吐量較低,erlang語言不易定制開發,二次開發

只支持Java和C++,C++還不成熟

有可能進行消息的重復消費
應用都有使用大規模,復雜的業務大數據的實時計算和日志采集

3.RabbitMQ各組件功能

1.Server:接收客戶端的連接,實現AMQP的實體服務。

2.Connection:連接,應用程序和Server的網絡連接,TCP連接

3.Channel:一個信道中有多個Connection,減輕了TCP connection的開銷

4.Message:消息

5.VirtualHost:虛擬主機,可以有多個,一個虛擬主機里面有許多交換機和隊列,但名稱不能相同

6.交換機:按照路由規則將消息映射到對應的隊列中。如果路由不到,就返回給消費者或者直接丟棄,常見類型有direct,fanout,topic,headers四種

7.隊列:保存消息,給消費者消息

8.綁定:交換機和隊列之間的路由規則

4.RabbitMQ的工作原理

? 生產者連接到Server,并開啟一個信道,建立許多連接,生產者將消息發送給broker server,然后brokersever根據virtualhost中的交換機和隊列的路由規則保存在隊列中,消費者和中間者建立連接了之后,從隊列中取消息進行一定的消費。

5.RabbitMQ的工作模式

1.simple模式:

? 生產者將消息直接發送到隊列中,消費者監聽隊列中存在消息,就直接取出消費掉,隊列之后將消息刪除。

? 隱患:消息可能沒有被消費者正確處理,但隊列仍然將消息刪除了,造成了消息的丟失,這時候設置手動的ack比較合適。

2.work Queues模式:

? 生成者將消息發送到隊列中,有多個消費者去搶奪這個消息,多并發的情況下就設置一個開關,保證消息只能被一個消費者消費

3.publish/subscribe發布訂閱模式

? 消費者監聽隊列,生產者將消息發給broker,由交換機將消息轉發到綁定每個交換機的每個隊列,每個綁定交換機的隊列都會收到消息

4.routing路由模式

? 只有當交換機和隊列的key能夠匹配之后,交換機才將消息轉發到對應的隊列中,之后綁定隊列的消費者才能消費

5.topic主題模式(路由模式的一種)

? 存在模糊匹配的方式

6.RabbitMQ消息丟失的情況有哪些?

1.生產者發送消息到broker server時發生丟失

2.broker server 存儲的消息丟失

3.broker server 存儲的消息分發給消費者時丟失

7.消息丟失的原因和解決方法

1.生產者發送消息到broker server時發生丟失:

? 原因:1.發送過程中存在網絡問題? ?2.代碼本身邏輯問題

? 解決方法:發送方確認機制(publisher confirm):生產者將信道設置成confirm模式,一旦信道進入這個confirm模式,信道上面的消息就會被指派一個唯一id,一旦消息被投遞到隊列中,broker就會返回一個確認消息給生產者(包含消息的唯一id),這就確保了消息的成功傳遞(confirm模式最大的好處就是它是異步的,一旦發布了一條消息,生產者可以繼續發送消息,消息被確認了之后,生產者會調用回調方法來確認,如果broker server因為自身錯誤丟失了消息就會返回一個nack,生產者之后再重新做相應的處理)

? 發布確認的情況:

1.單獨發布確認:一條消息只有被確認了之后,才能繼續發送消息,如果指定時間沒有返回確認信息就會拋異常

2.批量發布確認:一次性發布一批消息,但如果發送故障導致發布出現問題之后,就無法知道是哪個消息出現了問題,就導致需要重新發一整批消息,同步操作,會阻塞消息的發布

3.異步發布確認:邏輯雖然比前兩個復雜,但是因為異步提高了許多效率,將消息的確認異步處理,發送消息之后仍然可以繼續發送消息。

? 還可以使用AMQP的事務處理,但是這樣的方式效果不是特別的好,因為這個事務是同步的,一旦有一條消息丟失了之后,就會阻塞整個發送的過程。跟單獨發布類似了

2.Broker Server 中存儲的消息丟失:

原因:消息沒有持久化,服務器重啟的時候導致消息丟失

? 解決方式:1.消息回退:通過設置mandatory參數可以在當消息傳遞過程中不可達目的地時將消息返回給生產者。對于這些無法路由的消息就設定一個備份交換機,然后將消息存儲到備份交換機的隊列中,這時候之后就手動地對這些隊列中的消息進行處理

? 2.設置持久化:當MQ接收到消息的時候,通過持久化的方式將消息存儲到硬盤中

3.RabbitMQ 發給消費者時消息丟失:

原因:1.消費者接收到消息之后,還沒來得及處理消息,消費者機器就宕機了

2.處理消息存在異常

解決方案:默認采用了自動應答的方式,要想消息在消費過程中不丟失,需要把手動應答轉換成自動應答。

8.RabbitMQ消息基于什么傳輸

? 由于TCP連接的創建和銷毀開銷較大,且并發數會受到系統資源的限制,RabbitMQ采用信道的方式來傳輸數據。信道是建立在真實的TCP連接內的虛擬連接,每個tcp上的信道數量是沒有限制的。

9.RabbitMQ支持消息冪等性?

? 支持的,當生產者給mq發送一條消息的時候,mq內部都會生成一個inner-msg-id,作為去重的依據(消息投遞失敗并重傳),防止重復的消息進入隊列。消費同理,要求消費體中必須要有一個bizid,避免一條消息被重復消費。

10.RabbitMQ消息持久化的條件

1.聲明隊列必須設置為持久化durable設置為true

2.消息推送投遞模式必須設置持久化,deliveryMode設置為2(持久)

3.消息到達持久化的交換機

4.消息到達持久化的隊列

11.RabbitMQ死信隊列的介紹

定義:由于一些原因導致queue種的某些消息無法被正常消費,這些消息沒有后續的處理,就變成了死信消息

來源:消息TTL過期,(隊列達到最大值,消息無法加入到隊列中),消息被拒絕

用處:用于實現延遲隊列

12.RabbitMQ延遲隊列的介紹

用來存放在指定時間被處理的隊列

使用場景:

1.訂單在10分鐘內未支付自動取消

2.用戶注冊之后,3天沒有登錄就發短信提醒

3.用戶發起退款,3天內商家沒有處理,就直接通知運營人員

4.預定會議后,開始前10分鐘通知各個人員進行參會

實現條件:1.消息設置TTL? 2.存在死信隊列

13.RabbitMQ如何處理消息堆積

? 當出現消息擠壓之后,先處理宕機的消費者,然后創建原先N倍的隊列,將堆積的消息都輪詢到這些隊列中,然后再創建N倍的消費者,每一個消費者對應一個隊列,快速地把堆積的消息給消費了之后,恢復到原來的模式。(這種做法就相當于臨時將queue的資源和消費者的i資源擴大了N倍,消費的速度也變為了N倍)

14.RabbitMQ如何處理消息中丟失的數據

? 在流量的低峰期的時候,寫一個程序去手動查詢那些丟失的信息,然后將消息重新發送到mq中,讓消費者進行消費

15.RabbitMQ如何處理長時間未處理導致寫滿的情況?

? 和上面的情況類似,先寫一個程序直接去MQ中消費消息,消費一個就丟棄一個,先降低MQ的壓力,等到流量低峰期時,就去手動地查詢丟失的數據

16.如何設計一個消息隊列

這個問題可以觀看我以前的博客:Java項目--仿RabbitMQ的消息隊列_04Koi.的博客-CSDN博客

這里面詳細講解了如何簡單設計一個消息隊列,感謝觀看!

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

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

相關文章

Elasticsearch 文檔檢索系統

學習筆記:Elasticsearch 文檔檢索系統 1. 技術棧與核心組件 Node.js:后端運行環境,適合構建高性能 Web 服務。Express:Node.js 的 Web 框架,簡化 API 開發。Elasticsearch:分布式全文檢索引擎,支…

如何準確查看服務器網絡的利用率?

在服務器運維與性能調優過程中,網絡利用率是一個不容忽視的關鍵指標。它反映了服務器帶寬資源的實際使用情況,是判斷系統瓶頸、規劃資源擴展、排查連接問題的重要依據。很多人誤以為網絡是否正常只要“能上網”或“Ping得通”就可以了,實際上…

掌握Spring聲明式事務傳播機制:AOP與ThreadLocal的協同工作

聲明式事務的傳播機制是解決多個事務方法嵌套調用時,事務如何創建、復用、掛起或隔離的核心邏輯。它的實現依賴于事務管理器、事務狀態管理、線程上下文綁定等組件的協同,本質是通過一套 “規則判斷 狀態維護” 的邏輯,在方法調用時動態決定…

@Transactional事務注解的批量回滾機制

關鍵機制說明:1.??事務注解生效??:Transactional(rollbackFor Exception.class)Override Transactional(rollbackFor Exception.class) public Boolean saveUser(UserDTO userDto) {SysUser sysUser new SysUser();BeanUtils.copyProperties(user…

飛算 JavaAI 深度體驗:開啟 Java 開發智能化新紀元

個人主頁:?喜歡做夢 歡迎 👍點贊 ?關注 ??收藏 💬評論 目錄 一、引言 二、飛算 JavaAI 初印象與功能概覽 (一)初識飛算 JavaAI (二)核心功能模塊概覽 三、智能代碼生成功能深度體…

pandas銷售數據分析

pandas銷售數據分析 數據保存在data目錄 消費者數據:customers.csv商品數據:products.csv交易數據:transactions.csv customers.csv數據結構:字段描述customer_id客戶IDgender性別age年齡region地區membership_date會員日期produc…

訪問Windows服務器備份SQL SERVER數據庫

以前沒有直接訪問過Windows服務器,今天剛一看到的是時候有點懵,竟然下意識的使用SecureCRT遠程工具去連了一下,然后領導說,看一下用戶名,突然意識到,跟我們平時遠程桌面是一樣的。 一、 win + R 打開命令窗口 二、 輸入 mstsc 三、 輸入遠程地址 四、點擊連接,如果有彈…

C++ 面向對象 - 對象定義方法匯總

C對象定義方法匯總 1. 棧上定義方式 1.1 調用無參構造函數的定義方式 無參構造函數有兩種: 默認無參構造函數Demo(){}默認值列表構造函數。Demo():a{1},b{2}{} // 使用初始化列表實現對象定義方式: Demo d; Demo d1{}; // 以下定義方式還調用了拷貝構造…

指尖上的魔法:優雅高效的Linux命令手冊

一、Linux基礎指令 1. ls ls:對于目錄,列出該目錄下的所有子目錄與文件,對于文件,將列出文件名以及其他信息。 -a:列出目錄下的所有文件,包含以.開頭的隱藏文件 -l:列出文件的詳細信息 -d:將目錄…

《磁力下載工具實測:資源搜索+高速下載一站式解決方案》

嘿,朋友們!我是阿燦,今天給大家帶來一個超實用的看片神器,特別適合老司機們使用,保證讓你眼前一亮!推薦一款比某雷更好用的下載工具,搭配資源搜索神器,輕松獲取資源不限速。超強磁力…

Go網絡編程基礎:網絡模型與協議棧概述 - 從理論到實踐的完整指南

1. 引言 在當今的互聯網時代,網絡編程已經成為后端開發的核心技能。Go語言以其出色的并發性能和簡潔的語法,在網絡編程領域展現出了強大的優勢。從Docker、Kubernetes到眾多微服務框架,Go已經成為構建高性能網絡應用的首選語言之一。 你是否…

Web攻防-SSTI服務端模版注入利用分類語言引擎數據渲染項目工具挖掘思路

知識點: 1、WEB攻防-SSTI-利用分類&功能點 2、WEB攻防-SSTI-利用項目&挖掘思路 SSTI(Server Side Template Injection) 服務器模板注入, 服務端接收了用戶的輸入,將其作為 Web 應用模板內容的一部分,在進行目標編譯渲染的過程中&…

李沐動手學深度學習Pytorch-v2筆記【07自動求導代碼實現】

文章目錄前言自動求導實現非標量變量的反向傳播分離計算Python控制流的梯度計算前言 關于走動求導的理論知識個人有點難以理解,推薦大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138這篇文章,講的很好。 自動求導實現 impor…

strchr 與 strstr 函數詳解

一.strchr - 字符查找函數1.函數原型char *strchr(const char *str, int c);2.核心功能在字符串中查找特定字符的第一次出現位置3.參數說明參數 類型 說明str const char* 要搜索的字符串c int 要查找的字符(自動轉換為char)4.返回值…

jakes信道模型

Jakes 模型 前面我們介紹了多徑信道合成信號可表示為: r(t)Re{∑i0N(t)?1ai(t)u(t?τi(t))ej2πfc(t?τi(t))?Di(t)} r(t)Re \left\{\sum_{i0}^{N(t)-1}a_{i}(t)u(t-\tau_{i}(t))e^{j2\pi f_{c}(t-\tau_{i}(t))\phi_{D_{i}}(t)} \right\} r(t)…

JVM類加載機制解析

什么是類加載器? 類加載器是JVM的核心組件之一,負責將Java字節碼文件(.class文件)加載到JVM內存中。由于JVM只能執行二進制字節碼,類加載器的作用就是將編譯后的.class文件轉換為JVM可以理解和執行的格式,使…

用Python和OpenCV從零搭建一個完整的雙目視覺系統(二)

本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫,從零開始構建一個完整的雙目立體視覺系統。 本項目github地址:https://github.com/present-cjn/stereo-vision-python.git 項目架構設計:藍圖、分工與工作流 在上一篇文章中&#…

億級流量下的緩存架構設計:Redis+Caffeine多級緩存實戰

億級流量下的緩存架構設計:RedisCaffeine多級緩存實戰 一、為什么需要多級緩存? 在億級流量場景下,單純依賴Redis會遇到三大瓶頸:網絡延遲:Redis遠程訪問通常需要1-5ms,QPS超過10萬時成為瓶頸資源成本&…

AI基建還能投多久?高盛:2-3年不是問題,回報窗口才剛開啟

高盛表示,盡管AI商業化變現仍處早期階段,但基于成本削減的第一階段回報已經顯現。預測到2030年AI自動化可為財富500強企業節省約9350億美元成本。分析師認為,這一早期收益足以支撐當前AI基礎設施投資水平,盡管增長率可能放緩。雖然…

【mac】快捷鍵使用指南

在Mac上,根據選擇對象的不同,在選擇時移動的方法也有所不同,以下是具體介紹: 移動文件或文件夾:可通過拖放操作移動。打開“訪達”(Finder),找到要移動的文件或文件夾,按…