1. 程式人生 > 實用技巧 >什麼是MQ(訊息中介軟體)?能解決哪些問題?

什麼是MQ(訊息中介軟體)?能解決哪些問題?

1、入門概述

1、1 什麼是訊息中介軟體?

訊息中介軟體事利用高效可靠的訊息傳遞機制進行非同步的資料傳輸,並基於資料通訊進行分散式系統的整合。通過提供訊息佇列模型和訊息傳遞機制,可以在分散式的環境下擴充套件程序間的通訊。

1、2 為什麼要在系統中引入訊息中介軟體?

解耦、削峰、非同步

鏈式呼叫是我們在寫程式的時候的一般流程,為了完成應整體的功能,會將其拆分成多個函式(或子模組),比如模組A呼叫模組B,模組B呼叫模組C,模組C呼叫模組D,但是在大型分散式應用中,系統間的RPC互動頻繁,一個功能背後要呼叫上百個介面並非不可能,這種架構有一下幾個劣勢:

  • 1、這些介面之間的耦合比較嚴重,每系增一個下游的功能,都要上游的所有相關介面進行改造,舉個例子:假如系統A要傳送資料給系統B和C,傳送給每個系統的資料可能有差異,因此係統A對要傳送給每個系統的資料進行了組裝,然後逐一發送;當代碼上線後,新增了一個需求:把資料也傳送給D。此時就需要修改A系統,讓他感知到D的存在,同時把資料處理好給D。在這個過程中你會看到,每接入一個下游系統,都要對A系統進行程式碼改造,開發聯調的效率很低。其整體架構如下圖:
    在這裡插入圖片描述
  • 2、面對大流量併發時,容易被沖垮,每個介面模組的吞吐量是有限的,這個上限能力如同一個堤壩,當大流量來臨的時候,就會被沖垮。
  • 3、存在效能問題,RPC介面呼叫基本上是同步的,整體的服務效能遵循“木桶原理”,即鏈路雜種最慢的介面:
    在這裡插入圖片描述
    根據上述的幾個問題,我們在設計系統的時候可以明確達到的目標:
    1、要做到系統解耦,當新的模組進來的時候,可以做到程式碼改動最小
    2、設定流量緩衝區,可以讓後端系統按照自身的吞吐能力進行消費,不被衝快
    3、強依賴梳理,將非關鍵呼叫的鏈路的操作非同步化,提升整體系統的吞吐能力,,比如上圖中A、B、C、D是讓使用者發起付款,然後返回付款成功提示的幾個關鍵流程,而B1是通知付款後通知商家發貨的模組,那麼實質上使用者對B1完成的時間容忍度比較大(比如幾秒之後),可以將其非同步化。

在現在的系統視線中,MQ訊息佇列是普遍使用的,可以完美的解決這些問題的利器。下圖是使用了MQ的簡單架構圖,可以看到MQ在最前端對流量進行蓄洪,下游的系統A\B\C只與MQ打交道,通過事先定義好的訊息格式來解析。
在這裡插入圖片描述
引入MQ後的系統框架,互動方式與最初的鏈式呼叫架構非常不同,雖然可以解決上文提到的問題,但是也要充分理解其原理特性來避免其帶來的副作用,保證訊息的”可靠投遞“

1、3 那麼訊息中介軟體是如何解決的呢?

面向訊息中介軟體(MOM)能夠很好的解決上述問題,是指利用高效可靠的訊息傳遞機制,與平臺無關的資料交流,並基於資料通訊來進行分散式系統的整合
通過訊息傳遞和訊息排隊模型在分散式環境下提供的應用解耦,彈性伸縮,冗餘儲存,流量削峰,非同步通訊,資料同步

等功能。
大致過程是這樣的:
傳送者把訊息傳送給伺服器,訊息伺服器將訊息放在若干佇列(queue)/主題(topic)中,在合適的時候,訊息伺服器會將訊息傳送給接受者,這個過程中,傳送和接收是非同步的,也就是傳送無需等待,而且傳送者和接受者的生命週期也沒有必須的關係;
尤其在釋出pub/訂閱sub的模式下,也可以完成一對多的通訊,即讓一個訊息有多個接受者。

整體架構
在這裡插入圖片描述