MQ概念

MQ(Message Queue)消息隊列,是基礎數(shù)據(jù)結構中“先進先出”的一種數(shù)據(jù)機構。指把要傳輸?shù)臄?shù)據(jù)(消息)放在隊列中,用隊列機制來實現(xiàn)消息傳遞——生產者產生消息并把消息放入隊列,然后由消費者去處理。消費者可以到指定隊列拉取消息,或者訂閱相應的隊列,由MQ服務端給其推送消息。

MQ的作用

消息隊列中間件是分布式系統(tǒng)中重要的組件,主要解決應用解耦,異步消息,流量削鋒等問題,實現(xiàn)高性能,高可用,可伸縮和最終一致性架構。

應用程序解耦合:一個業(yè)務需要多個模塊共同實現(xiàn),或者一條消息有多個系統(tǒng)需要對應處理,只需要主業(yè)務完成以后,發(fā)送一條MQ,其余模塊消費MQ消息,即可實現(xiàn)業(yè)務,降低模塊之間的耦合。

任務異步處理:主業(yè)務執(zhí)行結束后從屬業(yè)務通過MQ,異步執(zhí)行,減低業(yè)務的響應時間,提高用戶體驗。
同步變異步
情景:
電商項目中常有的一個業(yè)務場景。用戶在線下單之后調用訂單服務,訂單服務會依次調用短信服務進行短信通知、郵件服務進行郵件通知、下單消息通知完成上述通知之后向用戶返回請求結果。如下圖所示:

在這里插入圖片描述

那么由于整個業(yè)務流程是同步進行,因此會暴露兩個缺點:
1、同步總耗時長 2、訂單服務與其他服務是強耦合
將同步操作更改為異步操作
(1)異步–線程池如下圖所示


在這里插入圖片描述

用戶下單后訂單服務在線程池中創(chuàng)建并啟動線程任務,每個線程相互不影響每個線程也不會像同步那樣需要等待,各自分開獨立執(zhí)行互不影響。這樣也能達到異步的操作效果,但是存在以下缺點:
1、自己實現(xiàn)線程池 2、強耦合(線程池實現(xiàn)的代碼是需要整合到訂單服務中,進而導致訂單服務和其他服務并沒有解耦)
(2)異步–消息隊列MQ如下圖


在這里插入圖片描述

用戶調用訂單服務之后,訂單服務向MQ發(fā)送請求,MQ接收請求后返回結果。至此訂單服務和用戶之間的請求閉環(huán)完成。MQ會去執(zhí)行后續(xù)的步驟,短信服務、郵件服務、消息通知服務等一系列動作。后續(xù)的短信服務、郵件服務、消息服務只和MQ發(fā)生交集,降低了和訂單服務之間的耦合性,達到了解耦的作用也降低了請求時間的消耗。

削峰填谷:高并發(fā)情況下,業(yè)務異步處理,提供高峰期業(yè)務處理能力,避免系統(tǒng)癱瘓。

01.jpg

消息被MQ保存起來了,然后系統(tǒng)就可以按照自己的消費能力來消費,比如每秒1000個數(shù)據(jù),這樣慢慢寫入數(shù)據(jù)庫,這樣就不會卡死數(shù)據(jù)庫了。

02.jpg

但是使用了MQ之后,限制消費消息的速度為1000,但是這樣一來,高峰期產生的數(shù)據(jù)勢必會被積壓在MQ中,高峰就被“削”掉了。但是因為消息積壓,在高峰期過后的一段時間內,消費消息的速度還是會維持在1000QPS,直到消費完積壓的消息,這就叫做“填谷”

03.jpg

我們將大流量的請求交給消息隊列去處理,而消息隊列只是接收消息而不處理消息最終的業(yè)務實現(xiàn)處理還是交給秒殺服務去完成。所以大量用戶請求并沒有之間將壓力交給秒殺服務而是交給了消息隊列。
我可以給消息隊列設置限定值當達到限定值將后續(xù)操作交由其他服務處理等,那么進而可在消息隊列中可以做更多的事情,這樣的一個削峰處理有效的保護了秒殺服務,降低了服務掛掉的風險。

MQ的缺點
1、系統(tǒng)可用性降低。依賴服務也多,服務越容易掛掉。需要考慮MQ癱瘓的情況
2、系統(tǒng)復雜性提高。需要考慮消息丟失、消息重復消費、消息傳遞的順序性
3、業(yè)務一致性。主業(yè)務和從屬業(yè)務一致性的處理

2、消息中間件的組成
2.1 Broker消息服務器,作為server提供消息核心服務
2.2 Producer消息生產者,業(yè)務的發(fā)起方,負責生產消息傳輸給broker,
2.3 Consumer消息消費者,業(yè)務的處理方,負責從broker獲取消息并進行業(yè)務邏輯處理
2.4 Topic主題,發(fā)布訂閱模式下的消息統(tǒng)一匯集地,不同生產者向topic發(fā)送消息,由MQ服務器分發(fā)到不同的訂閱者,實現(xiàn)消息的廣播
2.5 Queue隊列,PTP模式下,特定生產者向特定queue發(fā)送消息,消費者訂閱特定的queue完成指定消息的接收
2.6 Message消息體,根據(jù)不同通信協(xié)議定義的固定格式進行編碼的數(shù)據(jù)包,來封裝業(yè)務數(shù)據(jù),實現(xiàn)消息的傳輸

3 消息中間件模式分類

3.1 點對點PTP點對點:使用queue作為通信載體
說明:
消息生產者生產消息發(fā)送到queue中,然后消息消費者從queue中取出并且消費消息。
消息被消費以后,queue中不再存儲,所以消息消費者不可能消費到已經被消費的消息。 Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費。
3.2 發(fā)布/訂閱Pub/Sub發(fā)布訂閱(廣播):使用topic作為通信載體
說明:
消息生產者(發(fā)布)將消息發(fā)布到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不同,發(fā)布到topic的消息會被所有訂閱者消費。

5 消息中間件應用場景
5.1 異步通信
有些業(yè)務不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但并不立即處理它。想向隊列中放入多少消息就放多少,然后在需要的時候再去處理它們。

5.2 解耦
降低工程間的強依賴程度,針對異構系統(tǒng)進行適配。在項目啟動之初來預測將來項目會碰到什么需求,是極其困難的。通過消息系統(tǒng)在處理過程中間插入了一個隱含的、基于數(shù)據(jù)的接口層,兩邊的處理過程都要實現(xiàn)這一接口,當應用發(fā)生變化時,可以獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。

5.3 冗余
有些情況下,處理數(shù)據(jù)的過程會失敗。除非數(shù)據(jù)被持久化,否則將造成丟失。消息隊列把數(shù)據(jù)進行持久化直到它們已經被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風險。許多消息隊列所采用的”插入-獲取-刪除”范式中,在把一個消息從隊列中刪除之前,需要你的處理系統(tǒng)明確的指出該消息已經被處理完畢,從而確保你的數(shù)據(jù)被安全的保存直到你使用完畢。

5.4 擴展性
因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。不需要改變代碼、不需要調節(jié)參數(shù)。便于分布式擴容。

5.5 過載保護
在訪問量劇增的情況下,應用仍然需要繼續(xù)發(fā)揮作用,但是這樣的突發(fā)流量無法提取預知;如果以為了能處理這類瞬間峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住突發(fā)的訪問壓力,而不會因為突發(fā)的超負荷的請求而完全崩潰。

5.6 可恢復性
系統(tǒng)的一部分組件失效時,不會影響到整個系統(tǒng)。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統(tǒng)恢復后被處理。

5.7 順序保證
在大多使用場景下,數(shù)據(jù)處理的順序都很重要。大部分消息隊列本來就是排序的,并且能保證數(shù)據(jù)會按照特定的順序來處理。

5.8 緩沖
在任何重要的系統(tǒng)中,都會有需要不同的處理時間的元素。消息隊列通過一個緩沖層來幫助任務最高效率的執(zhí)行,該緩沖有助于控制和優(yōu)化數(shù)據(jù)流經過系統(tǒng)的速度。以調節(jié)系統(tǒng)響應時間。

5.9 數(shù)據(jù)流處理
分布式系統(tǒng)產生的海量數(shù)據(jù)流,如:業(yè)務日志、監(jiān)控數(shù)據(jù)、用戶行為等,針對這些數(shù)據(jù)流進行實時或批量采集匯總,然后進行大數(shù)據(jù)分析是當前互聯(lián)網的必備技術,通過消息隊列完成此類數(shù)據(jù)收集是最好的選擇。

6 消息中間件常用協(xié)議
6.1 AMQP協(xié)議
AMQP即Advanced Message Queuing Protocol,一個提供統(tǒng)一消息服務的應用層標準高級消息隊列協(xié)議,是應用層協(xié)議的一個開放標準,為面向消息的中間件設計?;诖藚f(xié)議的客戶端與消息中間件可傳遞消息,并不受客戶端/中間件不同產品,不同開發(fā)語言等條件的限制。
優(yōu)點:可靠、通用

6.2 MQTT協(xié)議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發(fā)的一個即時通訊協(xié)議,有可能成為物聯(lián)網的重要組成部分。該協(xié)議支持所有平臺,幾乎可以把所有聯(lián)網物品和外部連接起來,被用來當做傳感器和致動器(比如通過Twitter讓房屋聯(lián)網)的通信協(xié)議。
優(yōu)點:格式簡潔、占用帶寬小、移動端通信、PUSH、嵌入式系統(tǒng)

6.3 STOMP協(xié)議
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協(xié)議,是一種為MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協(xié)議。STOMP提供一個可互操作的連接格式,允許客戶端與任意STOMP消息代理(Broker)進行交互。
優(yōu)點:命令模式(非topic\queue模式)

6.4 XMPP協(xié)議
XMPP(可擴展消息處理現(xiàn)場協(xié)議,Extensible Messaging and Presence Protocol)是基于可擴展標記語言(XML)的協(xié)議,多用于即時消息(IM)以及在線現(xiàn)場探測。適用于服務器之間的準即時操作。核心是基于XML流傳輸,這個協(xié)議可能最終允許因特網用戶向因特網上的其他任何人發(fā)送即時消息,即使其操作系統(tǒng)和瀏覽器不同。
優(yōu)點:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式占用帶寬大

6.5 其他基于TCP/IP自定義的協(xié)議
有些特殊框架(如:redis、kafka、zeroMq等)根據(jù)自身需要未嚴格遵循MQ規(guī)范,而是基于TCP\IP自行封裝了一套協(xié)議,通過網絡socket接口進行傳輸,實現(xiàn)了MQ的功能。

主要的MQ產品

主要的MQ產品包括:RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka、IBM WebSphere 等。

  • ActiveMQ:基于JMS
  • ZeroMQ:基于C語言開發(fā)
  • RabbitMQ:基于AMQP協(xié)議,erlang語言開發(fā),穩(wěn)定性好
  • RocketMQ:基于JMS,阿里巴巴產品
  • Kafka:類似MQ的產品;分布式消息系統(tǒng),高吞吐量


    image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容