RabbitMQ詳解,RabbitMQ是什么?架構是怎樣的?

目錄

一,RabbitMQ是什么?

二,RabbitMQ架構

2.1 首先我們來看下RabbitMQ里面的心概念Queue是什么?

2.2 交換器Exchange

2.3?RabbitMQ是什么?

2.4 重點看下優先級隊列是什么?

三,RabbitMQ集群

3.1 普通集群模式

3.2?鏡像隊列集群


一,RabbitMQ是什么?

假設我們程序員維護了2個服務,A服務負責轉發用戶請求到B服務,B服務是個算法服務,GPU資源有限,當請求量達到B服務處理不過來的時候,希望能有限處理我們的VIP服務(充錢的作用來了,哈哈......),那么問題來了,當普通用戶和會員用戶同時發起請求,怎樣才能做到會員優先?

這個問題好辦,沒有什么是加一層中間層解決不了的,加一層不夠,那就再加一層,哈哈

這次我們要加的中間層就是消息隊列RabbitMQ

二,RabbitMQ架構

2.1 首先我們來看下RabbitMQ里面的心概念Queue是什么?

消息隊列本質上就是類似鏈表的獨立進程,鏈表里的每一個節點是一個消息,它介于生產者和消費者之間,在流量高峰時先慢慢暫存數據,然后再慢慢消費數據,可以很好的保護消費者,也就是削峰填谷,這個類似鏈表的進程就是隊列

但消息也分很多種類,比如訂單消息,用戶消息,商品消息,為了更好的管理不同種類的數據,可以提供多個隊列,生產者可以自定義隊列的名字,并且根據需要將消息投遞到不同的隊列中,每個queue都是獨立的進程,某個進程掛了,不會影響其他進程工作

2.2 交換器Exchange

有些生產者想將消息發到一個Queue中,有些則是發給多個Queue中,甚至廣播給所有Queue,于是我們還需要一個可以定制消息路由分發的策略的組件,交換器Exchange,將它與Queue綁定在一起,通過一個類似正則表達式的字符串,聲明綁定的關系,讓用戶根據需要,選擇要投遞的序列,

這些維護在Exchange里面的路由方式和綁定關系我們稱為元數據

2.3?RabbitMQ是什么?

像這種包含多個Queue進程和Exchange組件的消息隊列,就是所謂的?RabbitMQ

每一臺服務上的RabbitMQ的實例,就代表一個broker,大佬們在這個架構的基礎上為RabbitMQ實現了各種豐富的特性,比如延時隊列,死信隊列,優先級隊列

2.4 重點看下優先級隊列是什么?

RabbitMQ支持在生產者發送消息時,為消息標上優先級,消費者總是消費優先級高的消息,所以我們前文中提到的VIP問題,就可以通過優先級隊列來實現

我們可以在A服務中,根據用戶的等級,為消息打上對應的優先級,在投遞到RabbitMQ中,B服務永遠消費高優消息,當高優消息處理完后,再處理普通消息(這就是氪金的用處)

三,RabbitMQ集群

雖然RabbitMQ功能很豐富,但是它的架構就是個單實例節點,有些過于簡單了,像什么高可用,高可擴展是一個都不沾,我們來看下RabbitMQ是怎么擴展這部分能力的?那就是RabbitMQ集群

既然單節點存在諸多問題,那就讓多個節點構成集群,我們可以在多個服務器上各部署一個RabbitMQ實例,并通過RabbitMQ提供的命令將這些實例組成一個集群,RabbitMQ支持多種集群模式,普通集群,鏡像隊列集群,Quorum隊列集群

3.1 普通集群模式

在普通集群模式中,每個broker都是一個完整功能的RabbitMQ實例,都能進行讀寫,他們之間會互相同步Exchange里面的元數據,但不會同步Queue的數據

假設Queue1,Queue2,Queue3分別部署在broker1,broker2,broker3中

對于寫操作來說:

生產者將消息寫入到broker1的Queue1中,Queue里的數據并不會同步給其他的broker,但如果此時Exchang中的元數據有變化,則會將Exchange的元數據同步到其他的broker上

對于讀操作來說:

消費者想要讀取Queue1中的數據時,如果訪問的是broker1,則直接返回Queue1的數據,如果訪問的是broker2,broker2則會根據Exchange里的元數據,從broker1里面讀取數據,再返回給消費者,這樣就可以通過增加broker,提升RabbitMQ集群整體的吞吐量,保證了擴展性

但問題也很明顯,雖然支持讀寫Queue的數量是增加了,但對于單個Queue本身的讀寫能力并沒有提升,而且更重要的是每個Broker依然有單點問題,Broker之間并沒有同步Queue里面的數據,某個Queue所在的Broker要是掛了,就沒辦法讀寫這個Queue了,這和高可用毫不沾邊,有更好的方案么?答案是有,請看3,2?

3.2?鏡像隊列集群

我們可以在普通集群的基礎上上,給Queue增加幾個副本到其它的broker上,他們有主從關系,主Queue負責讀寫數據,從Queue負責同步復制主Queue數據,所以從Queue也叫鏡像隊列,一旦主Queue所在的Broker掛了,從Queue就可以頂上成為新的主Queue,實現高可用,這就是所謂的鏡像隊列集群

對于寫操作:

數據寫入主Queue后,會將Exchange和Queue數據同步給其他的Broker

對于讀操作:

消費者讀取數據時,如果訪問的是主Queue所在的broker,則直接返回數據,否則當前broker會從主Queue所在的broker上讀區數據,之后返回給消費者

但是這個方案的缺點也很明顯,broker之間同步的數據量會變大,集群節點越多,帶寬壓力越大,本質上鏡像隊列集群是犧牲吞吐量換取的高可用,反觀前面的普通集群,雖然吞吐高,但是卻犧牲了高可用

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

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

相關文章

【一步步開發AI運動APP】六、運動計時計數能調用

之前我們為您分享了【一步步開發AI運動小程序】開發系列博文,通過該系列博文,很多開發者開發出了很多精美的AI健身、線上運動賽事、AI學生體測、美體、康復鍛煉等應用場景的AI運動小程序;為了幫助開發者繼續深耕AI運動領域市場,今…

MySQL——DQL的多表查詢

一、交叉連接 標準語法:select * from 表1 cross join 表2 where 表1.公共列 表2.公共列; 簡單語法:select * from 表1 , 表2 where 表1.公共列 表2.公共列; 公共列:兩張表具有相同含義的列,不是列名一樣。 …

【Linux內核】如何更加優雅閱讀Linux內核源碼(vscode)

1. 前言 因為已經習慣在Ubuntu下進行嵌入式工作開發,但Linux源碼在Source Insight下進行閱讀,一直很苦惱Linux/Windows來回切換的開發方式,當前發現可以通過 vscode clangd(擴展組件) 方式進行更好的內核源碼閱讀。 2. 環境 操作系統&…

21.OpenCV獲取圖像輪廓信息

OpenCV獲取圖像輪廓信息 在計算機視覺領域,識別和分析圖像中的對象形狀是一項基本任務。OpenCV 庫提供了一個強大的工具——輪廓檢測(Contour Detection),它能夠幫助我們精確地定位對象的邊界。這篇博文將帶你入門 OpenCV 的輪廓…

LETTERS(DFS)

【題目描述】 給出一個rowcolrowcol的大寫字母矩陣,一開始的位置為左上角,你可以向上下左右四個方向移動,并且不能移向曾經經過的字母。問最多可以經過幾個字母。 【輸入】 第一行,輸入字母矩陣行數RR和列數SS,1≤R,S≤…

Day2-2:前端項目uniapp壁紙實戰

再在wallpaper新建一個目錄components 在components下新建組件common-title 記得點擊創建同名目錄 在index加 <view class"select"><common-title></common-title></view> 圖片換了下&#xff0c;原來的有點丑&#xff0c;圖片可按自己喜歡…

其他 vector 操作詳解(四十)

介紹 除去向 vector 添加元素&#xff08;如 push_back&#xff09;之外&#xff0c;vector 還提供了許多其他操作&#xff0c;這些操作大多與 string 的操作類似。通過掌握這些操作&#xff0c;我們可以方便地查詢、修改和比較 vector 中的元素&#xff0c;從而構建靈活、高效…

【Leetcode 每日一題】368. 最大整除子集

問題背景 給你一個由 無重復 正整數組成的集合 n u m s nums nums&#xff0c;請你找出并返回其中最大的整除子集 a n s w e r answer answer&#xff0c;子集中每一元素對 ( a n s w e r [ i ] , a n s w e r [ j ] ) (answer[i], answer[j]) (answer[i],answer[j]) 都應當…

python基礎-13-處理excel電子表格

文章目錄 【README】【13】處理Excel電子表格【13.1】Excel文檔【13.2】安裝openpyxl模塊【13.3】讀取Excel文檔【13.3.1】使用openpyxl模塊打開excel文檔【13.3.2】從工作簿取得工作表【13.3.3】從工作表sheet獲取單元格cell【13.3.5】從表中獲取行和列【13.3.6】工作簿、工作…

ABS函數c++

簡介&#xff1a; abs 函數用于計算一個數的絕對值&#xff0c;在 C 中它繼承自 C 語言的標準庫&#xff0c;其歷史可以追溯到早期的 C 語言發展歷程&#xff0c;以下是詳細介紹&#xff1a; 早期編程語言的需求 在計算機編程的早期階段&#xff0c;處理數學運算就是一項基本…

閉環SOTA!北航DiffAD:基于擴散模型實現端到端自動駕駛「多任務閉環統一」

端到端自動駕駛目前是有望實現完全自動駕駛的一條有前景的途徑。然而&#xff0c;現有的端到端自動駕駛系統通常采用主干網絡與多任務頭結合的方式&#xff0c;但是它們存在任務協調和系統復雜度高的問題。為此&#xff0c;本文提出了DiffAD&#xff0c;它統一了各種駕駛目標并…

整車CAN網絡和CANoe

車載網絡中主要包含有Can網絡,Lin網絡,FlexRay,Most,以太網。 500kbps:500波特率,表示的數據傳輸的速度。表示的是最大的網速傳輸速度。也就是每秒 500kb BodyCan車身Can InfoCan娛樂信息Can 車身CAN主要連接的是ESB電動安全帶 ADB自適應遠光燈等 PTCan動力Can 底盤Can

實戰設計模式之迭代器模式

概述 與上一篇介紹的解釋器模式一樣&#xff0c;迭代器模式也是一種行為設計模式。它提供了一種方法來順序訪問一個聚合對象中的各個元素&#xff0c;而無需暴露該對象的內部表示。簡而言之&#xff0c;迭代器模式允許我們遍歷集合數據結構中的元素&#xff0c;而不必了解這些集…

JVM 垃圾回收器是如何判斷一個對象是否要回收?

JVM 垃圾回收器&#xff08;Garbage Collector&#xff09;需要判斷哪些對象是“垃圾”&#xff0c;即不再被程序使用的對象&#xff0c;以便回收它們占用的內存。JVM 主要使用以下兩種方法來判斷對象是否是垃圾&#xff1a; 1. 引用計數算法 (Reference Counting): 原理&…

kali——httrack

目錄 前言 使用教程 前言 HTTrack 是一款運行于 Kali Linux 系統中的開源網站鏡像工具&#xff0c;它能將網站的頁面、圖片、鏈接等資源完整地下載到本地&#xff0c;構建出一個和原網站結構相似的離線副本。 使用教程 apt install httrack //安裝httrack工具 httrac…

kotlin函數類型

一 函數類型定義 1 定義 函數類型就是 (Int, Int) -> Int 函數類型其實就是將函數的 “參數類型” 和 “返回值類型” 抽象出來 2 示例 &#xff1a; (Int, Int) -> Int 表示接收兩個 Int 參數并返回 Int 的函數類型&#xff1b; (String) -> Unit 表示接收 Strin…

C# Winform 入門(9)之如何封裝并調用dll

封裝dll 首先創建 .Net平臺 類庫 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求兩個double類型的數值的和/// &l…

前后端分離下,Spring Boot 請求從發起到響應的完整執行流程

以下是前后端分離架構下&#xff0c;Spring Boot 請求從發起到響應的完整執行流程&#xff0c;結合你提出的所有問題&#xff0c;按真實執行順序和職責鏈條重新整理所有核心概念、結構、關鍵類、數據轉換點和典型代碼示例&#xff1a; 一、前端發起請求&#xff08;步驟1-2&…

基于sklearn實現文本摘要思考

和各位小伙伴分享一下使用sklearn進行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 將文本分割成句子 計算每個句子的重要性(權重) 選擇權重最高的幾個句子組成摘要 常用的句子權重計算方法&#xff1a; TF-IDF&#xff1a;基于詞頻-逆文檔頻…

OpenHarmony子系統開發 - DFX(三)

OpenHarmony子系統開發 - DFX&#xff08;三&#xff09; 五、HiTraceMeter開發指導 HiTraceMeter概述 簡介 HiTraceMeter在OpenHarmony中&#xff0c;為開發者提供業務流程調用鏈跟蹤的維測接口。通過使用該接口所提供的功能&#xff0c;可以幫助開發者迅速獲取指定業務流…