您當前的位置:首頁 > 文化

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

作者:由 知乎使用者2xwD7f 發表于 文化時間:2018-12-26

一、什麼是訊息佇列

訊息佇列(Message Queue,簡稱MQ),指儲存訊息的一個容器,本質是個佇列。

訊息(Message)是指在應用之間傳送的資料,訊息可以非常簡單,比如只包含文字字串,也可以更復雜,可能包含嵌入物件。

訊息佇列(Message Queue)是一種應用間的通訊方式,訊息傳送後可以立即返回,有訊息系統來確保資訊的可靠專遞,訊息釋出者只管把訊息釋出到MQ中而不管誰來取,訊息使用者只管從MQ中取訊息而不管誰釋出的,這樣釋出者和使用者都不用知道對方的存在。

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

Producer:訊息生產者,負責產生和傳送訊息到 Broker;

Broker:訊息處理中心。負責訊息儲存、確認、重試等,一般其中會包含多個 queue;

Consumer:訊息消費者,負責從 Broker 中獲取訊息,並進行相應處理;

現在常用的MQ元件有ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ,當然近年來火熱的Kafka,從某些場景來說,也是MQ,當然kafka的功能更加強大。

雖然不同的MQ都有自己的特點和優勢,但是,不管是哪種MQ,都有MQ本身自帶的一些特點,下面,咱們談談訊息佇列的的特點、優勢、選型、以及應用場景。

二、為什麼需要訊息佇列

在高併發分散式環境下,由於來不及同步處理,透過使用訊息佇列,可以非同步處理請求,從而緩解系統的壓力。

舉一個訂單系統的例子:使用者點選下訂單,會觸發以下業務邏輯流程:

扣減庫存

生成相應的訂單

發簡訊通知等等

在業務發展初期這些邏輯可能放在一起同步執行,隨著業務訂單量增長,需要提升系統服務的效能,這時候可以將一些不需要立即生效的操作拆分出來非同步執行,比如發簡訊通知等,這種場景就可以使用訊息佇列MQ。

本質還是透過非同步來解決同步的系統壓力,所以我們在做架構設計的時候有一個原則:能非同步的就儘量不要同步。

三、訊息佇列的優點

1、遮蔽異構平臺的細節

:傳送方、接收方系統之間不需要了解雙方,只需認識訊息。

2、非同步

:訊息堆積能力;傳送方接收方不需同時線上,傳送方接收方不需同時擴容(削峰)。

3、解耦

:防止引入過多的API給系統的穩定性帶來風險;呼叫方使用不當會給被呼叫方系統造成壓力,被呼叫方處理不當會降低呼叫方系統的響應能力。

4、複用

:一次傳送多次消費。

5、可靠

:一次保證訊息的傳遞。如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到成功地傳遞它。

6、提供路由

:傳送者無需與接收者建立連線,雙方透過訊息佇列保證訊息能夠從傳送者路由到接收者,甚至對於本來網路不易互通的兩個服務,也可以提供訊息路由。

四、訊息佇列的特點

1.非同步性

將耗時的同步操作,透過以傳送訊息的方式,進行了非同步化處理。減少了同步等待的時間。

2.松耦合

訊息佇列減少了服務之間的耦合性,不同的服務可以透過訊息佇列進行通訊,而不用關心彼此的實現細節,只要定義好訊息的格式就行。

3.分散式

透過對消費者的橫向擴充套件,降低了訊息佇列阻塞的風險,以及單個消費者產生單點故障的可能性(

當然訊息佇列本身也可以做成分散式叢集

)。

4.可靠性

訊息佇列一般會把接收到的訊息儲存到本地硬碟上(

當訊息被處理完之後,儲存資訊根據不同的訊息佇列實現,有可能將其刪除

),這樣即使應用掛掉或者訊息佇列本身掛掉,訊息也能夠重新載入。

五、訊息佇列的選型

1.ActiveMQ

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

Apache出品,最早使用的訊息佇列產品,時間比較長了,最近版本更新比較緩慢。

2.RabbitMQ

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

RabbitMQ是erlang語言開發,結合erlang語言本身的併發優勢,支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。效能較好,但是不利於做二次開發和維護。

3.RocketMQ

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

阿里開源的訊息中介軟體,純Java開發,具有高吞吐量、高可用性、適合大規模分散式系統應用的特點。

4.ZeroMQ

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

號稱最快的訊息佇列系統,尤其針對大吞吐量的需求場景。

擴充套件性好,開發比較靈活,採用C語言實現,實際上只是一個socket庫的重新封裝,如果做為訊息佇列使用,需要開發大量的程式碼。

5.Kafka

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

Kafka是Apache下的一個子專案,是一個高效能跨語言分散式釋出/訂閱訊息佇列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。

6.訊息佇列的詳細比較

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

7.訊息佇列總結

訊息佇列的選型需要根據具體應用需求而定,ZeroMQ小而美,RabbitMQ大而穩,Kakfa和RocketMQ快而強勁。

四、訊息佇列的應用場景

1.非同步處理

訊息佇列的主要特點是非同步處理,主要目的是減少請求響應時間,實現非核心流程非同步化,提高系統響應效能。

所以典型的使用場景就是將比較耗時而且不需要即時(同步)返回結果的操作,作為訊息放入訊息佇列。

2.應用解耦

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

使用了訊息佇列後,只要保證訊息格式不變,訊息的傳送方和接收方並不需要彼此聯絡,也不需要受對方的影響,即解耦。

每個成員不必受其他成員影響,可以更獨立自主,只通過訊息佇列MQ來聯絡。

舉一個例子:使用者下訂單流程,下訂單後會發生扣庫存這個動作,

上游系統訂單

下游系統扣庫存

,就可以透過上圖的訊息佇列MQ來聯絡,扣庫存非同步化,從而實現訂單系統與庫存系統的應用解耦。

3.流量削鋒

流量削鋒也是訊息佇列中的常用場景,一般在秒殺或團搶活動中使用廣泛。

應用場景:秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入訊息佇列。

具體可以參考我的歷史文章:【

阿里P8架構師談:雙11秒殺系統如何設計?】

4.日誌處理

日誌處理是指將訊息佇列用在日誌處理中,比如Kafka的應用,解決大量日誌傳輸的問題。

5.訊息通訊

訊息佇列一般都內建了高效的通訊機制,因此也可以用於單純的訊息通訊,比如實現點對點訊息佇列或者聊天室等。

以上就是分散式之訊息佇列詳解,更多Redis系列、Dubbo微服務系列、資料庫系列等高併發架構設計,具體請參考高併發架構專題集合,【

超36期高併發架構總結:微服務+併發容器+秒殺實戰等】

高併發架構系列:詳解分散式之訊息佇列的特點、選型及應用場景

覺得不錯請點贊支援,有不同見解請留言討論,更多技術分享內容,檢視我的往期博文~

標簽: 佇列  訊息  MQ  非同步  系統