分佈式之消息隊列的特色、選型、及應用場景詳解

什麼是消息隊列

消息隊列(Message Queue,簡稱MQ),指保存消息的一個容器,本質是個隊列。前端

消息(Message)是指在應用之間傳送的數據,消息能夠很是簡單,好比只包含文本字符串,也能夠更復雜,可能包含嵌入對象。segmentfault

消息隊列(Message Queue)是一種應用間的通訊方式,消息發送後能夠當即返回,有消息系統來確保信息的可靠專遞,消息發佈者只管把消息發佈到MQ中而無論誰來取,消息使用者只管從MQ中取消息而無論誰發佈的,這樣發佈者和使用者都不用知道對方的存在。網絡

file

  • Producer:消息生產者,負責產生和發送消息到 Broker;
  • Broker:消息處理中心。負責消息存儲、確認、重試等,通常其中會包含多個 queue;
  • Consumer:消息消費者,負責從 Broker 中獲取消息,並進行相應處理;

如今經常使用的MQ組件有ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ,固然近年來火熱的Kafka,從某些場景來講,也是MQ,固然kafka的功能更增強大。架構

雖然不一樣的MQ都有本身的特色和優點,可是,不論是哪一種MQ,都有MQ自己自帶的一些特色,下面,我們談談消息隊列的的特色、優點、選型、以及應用場景。併發

爲何須要消息隊列

在高併發分佈式環境下,因爲來不及同步處理,經過使用消息隊列,能夠異步處理請求,從而緩解系統的壓力。異步

舉一個訂單系統的例子:用戶點擊下訂單,會觸發如下業務邏輯流程:socket

  • 扣減庫存
  • 生成相應的訂單
  • 發短信通知等等

在業務發展初期這些邏輯可能放在一塊兒同步執行,隨着業務訂單量增加,須要提高系統服務的性能,這時候能夠將一些不須要當即生效的操做拆分出來異步執行,好比發短信通知等,這種場景就可使用消息隊列MQ。分佈式

本質仍是經過異步來解決同步的系統壓力,因此咱們在作架構設計的時候有一個原則:能異步的就儘可能不要同步。高併發

消息隊列的優勢

一、屏蔽異構平臺的細節:發送方、接收方系統之間不須要了解雙方,只需認識消息。性能

二、異步:消息堆積能力;發送方接收方不需同時在線,發送方接收方不需同時擴容(削峯)。

三、解耦:防止引入過多的API給系統的穩定性帶來風險;調用方使用不當會給被調用方系統形成壓力,被調用方處理不當會下降調用方系統的響應能力。

四、複用:一次發送屢次消費。

五、可靠:一次保證消息的傳遞。若是發送消息時接收者不可用,消息隊列會保留消息,直到成功地傳遞它。

六、提供路由:發送者無需與接收者創建鏈接,雙方經過消息隊列保證消息可以從發送者路由到接收者,甚至對於原本網絡不易互通的兩個服務,也能夠提供消息路由。

file

消息隊列的特色

1.異步性

將耗時的同步操做,經過以發送消息的方式,進行了異步化處理。減小了同步等待的時間。

2.鬆耦合

消息隊列減小了服務之間的耦合性,不一樣的服務能夠經過消息隊列進行通訊,而不用關心彼此的實現細節,只要定義好消息的格式就行。

3.分佈式

經過對消費者的橫向擴展,下降了消息隊列阻塞的風險,以及單個消費者產生單點故障的可能性(固然消息隊列自己也能夠作成分佈式集羣)。

4.可靠性

消息隊列通常會把接收到的消息存儲到本地硬盤上(當消息被處理完以後,存儲信息根據不一樣的消息隊列實現,有可能將其刪除),這樣即便應用掛掉或者消息隊列自己掛掉,消息也可以從新加載。

消息隊列的選型

file

1.ActiveMQ

file

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

2.RabbitMQ

file

RabbitMQ是erlang語言開發,結合erlang語言自己的併發優點,支持不少的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的很是重量級,更適合於企業級的開發。性能較好,可是不利於作二次開發和維護。

3.RocketMQ

file

阿里開源的消息中間件,純Java開發,具備高吞吐量、高可用性、適合大規模分佈式系統應用的特色。

4.ZeroMQ

file

號稱最快的消息隊列系統,尤爲針對大吞吐量的需求場景。

擴展性好,開發比較靈活,採用C語言實現,實際上只是一個socket庫的從新封裝,若是作爲消息隊列使用,須要開發大量的代碼。

5.Kafka

file

Kafka是Apache下的一個子項目,是一個高性能跨語言分佈式發佈/訂閱消息隊列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。

6.消息隊列的詳細比較

file

7.消息隊列總結

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

消息隊列的應用場景

1.異步處理

消息隊列的主要特色是異步處理,主要目的是減小請求響應時間,實現非核心流程異步化,提升系統響應性能。

因此典型的使用場景就是將比較耗時並且不須要即時(同步)返回結果的操做,做爲消息放入消息隊列。

2.應用解耦

file

使用了消息隊列後,只要保證消息格式不變,消息的發送方和接收方並不須要彼此聯繫,也不須要受對方的影響,即解耦。

每一個成員沒必要受其餘成員影響,能夠更獨立自主,只經過消息隊列MQ來聯繫。

舉一個例子:用戶下訂單流程,下訂單後會發生扣庫存這個動做,上游系統訂單和下游系統扣庫存,就能夠經過上圖的消息隊列MQ來聯繫,扣庫存異步化,從而實現訂單系統與庫存系統的應用解耦。

3.流量削鋒

流量削鋒也是消息隊列中的經常使用場景,通常在秒殺或團搶活動中使用普遍。

應用場景:秒殺活動,通常會由於流量過大,致使流量暴增,應用掛掉。爲解決這個問題,通常須要在應用前端加入消息隊列。

4日誌處理

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

5消息通信

消息隊列通常都內置了高效的通訊機制,所以也能夠用於單純的消息通信,好比實現點對點消息隊列或者聊天室等。

相關文章
相關標籤/搜索