消息隊列MQ的特點、選型及應用場景

想要了解消息隊列的童鞋可以通過本篇可以深度瞭解消息隊列的特點,優勢,以及應用場景,並關注後續會連載相關文章。

一、什麼是消息隊列

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

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

消息隊列(Message Queue)是一種應用間的通信方式,消息發送後可以立即返回,有消息系統來確保信息的可靠專遞,消息發佈者只管把消息發佈到MQ中而不管誰來取,消息使用者只管從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

消息隊列MQ的特點、選型及應用場景

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

2.RabbitMQ

消息隊列MQ的特點、選型及應用場景

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

3.RocketMQ

消息隊列MQ的特點、選型及應用場景

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

4.ZeroMQ

消息隊列MQ的特點、選型及應用場景

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

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

5.Kafka

消息隊列MQ的特點、選型及應用場景

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

6.消息隊列的詳細比較

消息隊列MQ的特點、選型及應用場景

7.消息隊列總結

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

四、消息隊列的應用場景

1.異步處理

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

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

2.應用解耦

消息隊列MQ的特點、選型及應用場景

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

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

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

3.流量削鋒

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

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

4.日誌處理

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

5.消息通訊

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

以上,是分佈式之消息隊列的詳解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章