Lison
<dreamlison@163.com>
, v1.0.0
, 2023.06.22
RabbitMQ概念-優(yōu)勢、劣勢、應(yīng)用場景 、AMQP、工作原理
RabbitMQ概念
RabbitMQ,俗稱“兔子MQ”(可見其輕巧,敏捷),是目前非常熱門的一款開源消息中間件,不管是互聯(lián)網(wǎng)行業(yè)還是傳統(tǒng)行業(yè)都廣泛使用(最早是為了解決電信行業(yè)系統(tǒng)之間的可靠通信而設(shè)計)。
- 高可靠性、易擴展、高可用、功能豐富等
- 支持大多數(shù)(甚至冷門)的編程語言客戶端。
- RabbitMQ遵循AMQP協(xié)議,自身采用Erlang(一種由愛立信開發(fā)的通用面向并發(fā)編程的語言)編寫。
- RabbitMQ也支持MQTT等其他協(xié)議。
RabbitMQ具有很強大的插件擴展能力,官方和社區(qū)提供了非常豐富的插件可供選擇:
Community Plugins — RabbitMQ
消息隊列
MQ全稱Message Queue(消息隊列),是在消息的傳輸過程中保存消息的容器。多用于系統(tǒng)之間的異步通信
1、 同步通信相當(dāng)于兩個人當(dāng)面對話,你一言我一語。必須及時回復(fù),例如:系統(tǒng)一直接和系統(tǒng)二通訊
2、異步通信相當(dāng)于通過第三方轉(zhuǎn)述對話,可能有消息的延遲,但不需要二人時刻保持聯(lián)系
例如:系統(tǒng)一 中轉(zhuǎn)至 消息隊列 再中轉(zhuǎn)給系統(tǒng)二
消息
兩臺計算機間傳送的數(shù)據(jù)單位。消息可以非常簡單,例如只包含文本字符串;也可以更復(fù)雜,可能包含嵌入對象
隊列
數(shù)據(jù)結(jié)構(gòu)中概念。在隊列中,數(shù)據(jù)先進先出,后進后出。
RabbitMQ的優(yōu)勢
-
應(yīng)用解耦
在電商平臺中,用戶下訂單需要調(diào)用訂單系統(tǒng),此時訂單系統(tǒng)還需要調(diào)用庫存系統(tǒng)、支付系統(tǒng)、物流系統(tǒng)完成業(yè)務(wù)。此時會產(chǎn)生兩個問題:
1 如果庫存系統(tǒng)出現(xiàn)故障,會造成整個訂單系統(tǒng)崩潰。
2 如果需求修改,新增了一個X系統(tǒng),此時必須修改訂單系統(tǒng)的代碼。
如果在系統(tǒng)中引入MQ,即訂單系統(tǒng)將消息先發(fā)送到MQ中,MQ再轉(zhuǎn)發(fā)到其他系統(tǒng),則會解決以下問題:
1、由于訂單系統(tǒng)只發(fā)消息給MQ,不直接對接其他系統(tǒng),如果庫存系統(tǒng)出現(xiàn)故障,不影響整個訂單。
2、如果需求修改,新增了一個X系統(tǒng),此時無需修改訂單系統(tǒng)的代碼,只需修改MQ將消息發(fā)送給X系統(tǒng)即可。
-
異步提速
如果訂單系統(tǒng)同步訪問每個系統(tǒng),則用戶下單等待時長如下:
如果引入MQ,則用戶等待時間如下:
-
消峰填谷
假設(shè)我們的系統(tǒng)每秒只能承載1000請求,如果請求瞬間增多到每秒 5000,則會造成系統(tǒng)崩潰。此時引入mq即可解決該問題
使用了MQ之后,限制消費消息的速度為1000,這樣一來,高峰期產(chǎn)生的數(shù)據(jù)勢必會被積壓在MQ中,高峰就被“削”掉了,但是因為消息積壓,在高峰期過后的一段時間內(nèi),消費消息的速度還是會維持 在1000,直到消費完積壓的消息,這就叫做“填谷”。
RabbitMQ劣勢
- 系統(tǒng)可用性降低;系統(tǒng)引入的外部依賴越多,系統(tǒng)穩(wěn)定性越差。一旦MQ宕機,就會對業(yè)務(wù)造成影響。
- 系統(tǒng)復(fù)雜度提高;MQ的加入大大增加了系統(tǒng)的復(fù)雜度,以前系統(tǒng)間是同步的遠程調(diào)用,現(xiàn)在是通過MQ進行異步調(diào)用。
- 一致性問題;A系統(tǒng)處理完業(yè)務(wù),通過MQ給B、C、D三個系統(tǒng)發(fā)消息數(shù)據(jù),如果B系統(tǒng)、C系統(tǒng)處理成功,D系統(tǒng)處理失敗,則會造成數(shù)據(jù)處理的不一致
RabbitMQ應(yīng)用的場景
搶紅包、秒殺活動、搶火車票等
這些業(yè)務(wù)場景都是短時間內(nèi)需要處理大量請求,如果直接連接系統(tǒng)處理業(yè)務(wù),會耗費大量資源,有可能造成系統(tǒng)癱瘓。
而使用MQ后,可以先讓用戶將請求發(fā)送到MQ中,MQ會先保存請求消息,不會占用系統(tǒng)資源,且MQ會進行消息排序,先請求的秒殺成功,后請求的秒殺失敗。
消息分發(fā)
如電商網(wǎng)站要推送促銷信息,該業(yè)務(wù)耗費時間較多,但對時效性要求不高,可以使用MQ做消息分發(fā)。
數(shù)據(jù)同步
假如我們需要將數(shù)據(jù)保存到數(shù)據(jù)庫之外,還需要一段時間將數(shù)據(jù)同步到緩存(如Redis)、搜索引擎(如Elasticsearch)中。此時可以將數(shù)據(jù)庫的數(shù)據(jù)作為消息發(fā)送到MQ中,并同步到緩存、 搜索引擎中。
異步處理
在電商系統(tǒng)中,訂單完成后,需要及時的通知子系統(tǒng)(進銷存系統(tǒng)發(fā)貨,用戶服務(wù)積分,發(fā)送短信)進行下一步操作。為了保證訂單系統(tǒng)的高性能,應(yīng)該直接返回訂單結(jié)果,之后讓MQ通知子系統(tǒng)做其他非實時的業(yè)務(wù)操作。這樣能保證核心業(yè)務(wù)的高效及時
離線處理
在銀行系統(tǒng)中,如果要查詢近十年的歷史賬單,這是非常耗時的操作。如果發(fā)送同步請求,則會花費大量時間等待響應(yīng)。此時使 用MQ發(fā)送異步請求,等到查詢出結(jié)果后獲取結(jié)果即可。
RabbitMQ_AMQP
AMQP是為消息中間件設(shè)計的網(wǎng)絡(luò)協(xié)議。RabbitMQ是由Erlang語言編寫的基于AMQP的MQ產(chǎn)品
AMQP
即Advanced Message Queuing Protocol(高級消息隊列協(xié)議),是 一個網(wǎng)絡(luò)協(xié)議,專門為消息中間件設(shè)計。基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受不同中間件產(chǎn)品,不同開發(fā)語言等條件的限制。2006年AMQP規(guī)范發(fā)布,類比HTTP。
AMQP工作過程
生產(chǎn)者(Publisher)將消息發(fā)布到交換機(Exchange),交換機根據(jù)規(guī)則將消息分發(fā)給交換機綁定的隊列(Queue),隊列再將消息投遞給 訂閱了此隊列的消費者。
RabbitMQ工作原理
1、Producer :
消息的生產(chǎn)者。也是一個向交換機發(fā)布消息的客戶端應(yīng)用程序。
2、Connection:
連接。生產(chǎn)者/消費者和RabbitMQ服務(wù)器之間建立的TCP連接。
3、Channel:
信道。是TCP里面的虛擬連接。例如:Connection相當(dāng)于電纜, Channel相當(dāng)于獨立光纖束,一條TCP連接中可以創(chuàng)建多條信道,增加連接效率。無論是發(fā)布消息、接收消息、訂閱隊列都是通過信道完成的。
4、Broker :
消息隊列服務(wù)器實體。即RabbitMQ服務(wù)器
5、Virtual host:
虛擬主機。出于多租戶和安全因素設(shè)計的,把AMQP的基本組件劃分到一個虛擬的分組中。每個vhost本質(zhì)上就是一個mini版的 RabbitMQ服務(wù)器,擁有自己的隊列、交換機、綁定和權(quán)限機制。當(dāng)多個不同的用戶使用同一個RabbitMQ服務(wù)器時,可以劃分出多個虛擬主機。RabbitMQ默認的虛擬主機路徑是 /
6、Exchange :
交換機。用來接收生產(chǎn)者發(fā)送的消息,并根據(jù)分發(fā)規(guī)則,將這些消息分發(fā)給服務(wù)器中的隊列中。不同的交換機有不同的分發(fā)規(guī)則。
7、Queue:
消息隊列。用來保存消息直到發(fā)送給消費者。它是消息的容器, 也是消息的終點。消息一直在隊列里面,等待消費者鏈接到這個隊列將其取走。
8、Binding:
消息隊列和交換機之間的虛擬連接,綁定中包含路由規(guī)則,綁定信息保存到交換機的路由表中,作為消息的分發(fā)依據(jù)。
9、Consumer :
消息的消費者。表示一個從消息隊列中取得消息的客戶端應(yīng)用程序。
RabbitMQ為什么使用信道而不直接使用TCP連接通信?文章來源:http://www.zghlxwxcb.cn/news/detail-608569.html
TCP連接的創(chuàng)建和銷毀開銷特別大。創(chuàng)建需要3次握手,銷毀需 要4次分手。高峰時每秒成千上萬條TCP連接的創(chuàng)建會造成資源巨大的浪費。而且操作系統(tǒng)每秒處理TCP連接數(shù)也是有限制的, 會造成性能瓶頸。而如果一條線程使用一條信道,一條TCP鏈接 可以容納無限的信道,即使每秒成千上萬的請求也不會成為性能的瓶頸。文章來源地址http://www.zghlxwxcb.cn/news/detail-608569.html
到了這里,關(guān)于(一)RabbitMQ概念-優(yōu)勢、劣勢、應(yīng)用場景 、AMQP、工作原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!