RabbitMQ的詳解和使用

普信男孩阿洲發表於2024-06-02

一、什麼是MQ ?

1、MQ的概念

MQ 全稱Message Queue(訊息佇列),是在訊息的傳輸過程中儲存訊息的容器。多用於系統之間的非同步通訊。 下面用圖來理解非同步通訊,並闡明與同步通訊的區別。

同步通訊:甲乙兩人面對面交流,你一句我一句必須同步進行,兩人除此之外不做任何事情

非同步通訊:非同步通訊相當於透過第三方轉述對話,可能有訊息的延遲,但不需要二人時刻保持聯絡,訊息傳給第三方後,兩人可以做其他自己想做的事情,當需要獲取對方說話的內容時,直接從訊息佇列裡獲取即可。

2、理解訊息佇列

訊息 就是兩臺計算機間傳送的資料單位;本質上就是一段資料,它能被一個或者多個應用程式所理解,是應用程式之間傳遞的資訊載體。訊息可以非常簡單,例如只包含文字字串;也可以更復雜地嵌入物件。

佇列 是資料結構中概念。在佇列中,資料先進先出,後進後出,猶如排隊做核酸。

訊息佇列 MQ是把訊息和佇列結合起來,稱之為訊息佇列(Message Queue)。把要傳輸的資料(訊息)與佇列進行繫結,用佇列先進先出機制來實現訊息傳遞。訊息佇列由 生產者 和 消費者 兩部分構成;生產者主要負責產生訊息並把訊息放入佇列中,再由消費者去處理。消費者可以到指定佇列中獲取訊息,或者訂閱相應的佇列,最後由MQ服務端進行訊息推送。

什麼是訂閱?訂閱就是為消費者服務的,消費者提前訂閱,當訊息佇列中有訊息產出時,自動去獲取訊息進行消費。生活中有很多這種例子,比如購買騰訊、優酷等影片會員時就會有訂閱模式,當你的會員到期時,會自動幫你完成續費。

二、MQ的優勢和劣勢

1、優勢和作用

應用解耦 例如在我們非常熟悉電商系統平臺中,使用者下訂單需要呼叫訂單系統,訂單系統需要呼叫庫存系統、支付系統、物流系統等進行資料互動來完成整個下單業務,這種把整個業務都耦合在一起。很容易出現我們經常遇見的問題:

①、當中間某個環節庫存系統或支付系統出現異常或故障,會造成整個訂單系統崩潰無法完成訂單業務;

②、當我們需求開發時,可能會新增一個其他系統的業務與當前的訂單系統關聯並進行資料互動,此時就必須修改訂單系統的程式碼。如果系統壯大,業務越來越多,越來越複雜時,隨之帶來的維護成本也會成指數增加。

由此我們不難看出 系統耦合性越高,容錯性和可維護性就會越低。如果在系統中引入MQ,即訂單系統將訊息先傳送到MQ中,MQ再將資料訊息轉發到其他系統,問題就可以得到解決,MQ天生就是來幹這個事的。那麼當我們加入MQ以後整個系統會發生什麼變化?

①、由於訂單系統只發訊息給MQ,不直接對接其他系統,如果其他任何一個系統出現異常或故障時,不影響整個訂單業務的執行。當異常或故障解決以後,程式自動從MQ獲取資料資訊完成後續相關業務邏輯即可。

②、如果需求修改,新增了一個業務系統,此時無需修改其他系統的程式碼,只需修改MQ將訊息傳送給新增的系統即可,實現資料資訊的可靠有效傳遞。使用MQ讓系統應用間進行解耦,提升整個系統的容錯性和可維護性

非同步提速 開發一款App系統,其登入註冊是最為常見的需求,例如註冊的業務有手機註冊入庫、繫結郵箱驗證、手機簡訊驗證。

使用者的註冊操作需要等待350ms才能得到響應,如果郵件驗證系統/手機簡訊通知系統耗時比較長,那麼使用者的響應隨之就會變長,非常影響客戶的體驗度,而當使用了MQ後,客戶的體驗度飆升。

削峰填谷 假設系統承載的QPS是1000,如果流量頂峰時達到50000,則會造成系統壓垮崩潰。使用了MQ之後,限制消費訊息的速度為1000,把資料產生的壓力放在MQ中,系統的高峰就會被削掉,這個過程叫 削峰,因為訊息積壓的資料比較多,在高峰期過後的一段時間內,消費訊息的速度還會繼續維持在這個速度,直到把積壓的訊息消費完,這個過程叫 填谷。這樣可以大大提高系統的穩定性和使用者體驗。

2、劣勢

系統可用性降低: 系統引入的外部依賴越多,系統穩定性越差。一旦MQ當機,就會對業務造成影響。
系統複雜度提高: MQ的加入大大增加了系統的複雜度,以前系統間是同步的遠端呼叫,現在是透過MQ進行非同步呼叫。
一致性問題 : A系統處理完業務,透過MQ給B、C、D三個系統發訊息資料,如果B系統、C系統處理成功,D系統處理失敗,則會造成資料處理的不一致。

三、MQ的應用場景

1、高峰流量:搶紅包、秒殺活動、搶火車票等這些業務場景都是短時間內需要處理大量請求,如果直接連線系統處理業務,會耗費大量資源,有可能造成系統癱瘓。 而使用MQ後,可以先讓使用者將請求傳送到MQ中,MQ會先儲存請求訊息,不會佔用系統資源,且MQ會進行訊息排序,先請求的秒殺成功,後請求的秒殺失敗。

2、訊息分發:如電商網站要推送促銷資訊,該業務耗費時間較多,但對時效性要求不高,可以使用MQ做訊息分發

3、資料同步:假如我們需要將資料儲存到資料庫之外,還需要一段時間將資料同步到快取(如Redis)、搜尋引擎(如Elasticsearch)中。此時可以將資料庫的資料作為訊息傳送到MQ中,並同步到快取、 搜尋引擎中。

4、非同步處理:在電商系統中,訂單完成後,需要及時的通知子系統(進銷存系統發貨,使用者服務積分,傳送簡訊)進行下一步操作。為了保證訂單系統的高效能,應該直接返回訂單結果,之後讓MQ通知子系統做其他非實時的業務操作。這樣能保證核心業務的高效及時

5、離線處理:在銀行系統中,如果要查詢近十年的歷史賬單,這是非常耗時的操作。如果傳送同步請求,則會花費大量時間等待響應。此時使用MQ傳送非同步請求,等到查詢出結果後獲取結果即可。

四、AMQP

1、什麼是 AMQP : 即Advanced Message Queuing Protocol(高階訊息佇列協議),是一個網路協議,專門為訊息中介軟體設計。基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受不同中介軟體產品,不同開發語言等條件的限制。2006年AMQP規範釋出,類比HTTP。

2、AMQP工作過程: 生產者(Publisher)將訊息釋出到交換機(Exchange),交換機根據規則將訊息分發給交換機繫結的佇列(Queue),佇列再將訊息投遞給訂閱了此佇列的消費者

相關文章