MQ消息隊(duì)列

一、什么是消息隊(duì)列

????MQ(Message Queue)消息隊(duì)列,是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞信息;作為一個隊(duì)列,其主要的功能就是排隊(duì)積壓。面對高并發(fā)任務(wù)時,由于來不及同步處理,請求往往會發(fā)生堵塞,表現(xiàn)最為明顯的就是對數(shù)據(jù)庫的操作,如大量的insert、update之類的請求同時到達(dá)數(shù)據(jù)庫,直接導(dǎo)致無數(shù)的行鎖表鎖,甚至最后請求會堆積過多,從而觸發(fā)too many connections錯誤。
????此外,當(dāng)上游服務(wù)處理能力遠(yuǎn)大于下游的情況時,若上游服務(wù)直接調(diào)用下游服務(wù),由于下游服務(wù)處理能力遠(yuǎn)跟不上上游服務(wù),因此明顯的后果就是下游服務(wù)因處理壓力而導(dǎo)致崩潰.
????因此,MQ提出之初就是為了削峰限流,通過異步處理請求,減少請求相應(yīng)時間和邏輯及物理上的解耦,從而緩解系統(tǒng)的壓力,輕松應(yīng)對高并發(fā)的情況。

二、MQ在互聯(lián)網(wǎng)中的應(yīng)用舉例

????用戶注冊信息時,服務(wù)端收到用戶的注冊請求后,它會做這些操作:
【1】校驗(yàn)用戶名等信息,如果沒問題會在數(shù)據(jù)庫中添加一個用戶記錄;
【2】如果是用郵箱注冊會給你發(fā)送一封注冊成功的郵件,手機(jī)注冊則會發(fā)送一條短信;
【3】分析用戶的個人信息,做消息或應(yīng)用推送;
【4】發(fā)送給用戶一個包含操作指南的系統(tǒng)通知等等……
????但是對于用戶來說,注冊功能實(shí)際只需要第一步,只要服務(wù)端將他的賬戶信息存到數(shù)據(jù)庫中他便可以登錄上去做他想做的事情了。至于其他的事情,服務(wù)端可以把其他的操作放入對應(yīng)的消息隊(duì)列中然后馬上返回用戶結(jié)果,由消息隊(duì)列異步的進(jìn)行這些操作。

三、MQ背后工作模式

????p2p(point to point)和Publish/Subscribe(Pub/Sub)

3.1. P2P模式
image.png

????P2P模式包含三個角色:消息隊(duì)列(Queue),發(fā)送者(Sender),接收者(Receiver)。每個消息都被發(fā)送到一個特定的隊(duì)列,接收者從隊(duì)列中獲取消息。隊(duì)列保留著消息,直到他們被消費(fèi)或超時。

P2P的特點(diǎn)
【1】每個消息只有一個消費(fèi)者(Consumer)(即一旦被消費(fèi),消息就不再在消息隊(duì)列中);
【2】發(fā)送者和接收者之間在時間上沒有依賴性,也就是說當(dāng)發(fā)送者發(fā)送了消息之后,不管接收者有沒有正在運(yùn)行,它不會影響到消息被發(fā)送到隊(duì)列;
【3】接收者在成功接收消息之后需向隊(duì)列應(yīng)答成功 。
如果希望發(fā)送的每個消息都會被成功處理的話,那么需要P2P模式。

3.2.Pub/sub模式
image.png

????該模式包含三個角色,主題(Topic),發(fā)布者(Publisher),訂閱者(Subscriber)。 多個發(fā)布者將消息發(fā)送Topic,系統(tǒng)將這些消息傳遞給多個訂閱者。
Pub/Sub的特點(diǎn)
【1】每個消息可以有多個消費(fèi)者;
【2】發(fā)布者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須創(chuàng)建一個訂閱者之后,才能消費(fèi)發(fā)布者的消息;
【3】為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)

????為了緩和這樣嚴(yán)格的時間相關(guān)性,JMS允許訂閱者創(chuàng)建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運(yùn)行),它也能接收到發(fā)布者的消息。
????如果希望發(fā)送的消息可以不被做任何處理、或者只被一個消費(fèi)者處理、或者可以被多個消費(fèi)者處理的話,那么可以采用Pub/Sub模型。

四、MQ使用場景

【1】異步處理
【2】系統(tǒng)解耦
【3】流量削峰
【4】消息通訊

五、使用MQ的不足

【1】多了MQ中間件、系統(tǒng)成本增加,結(jié)構(gòu)更復(fù)雜;
【2】消息傳遞路徑更長,延時會增加;
【3】消息可靠性和重復(fù)性難以平衡,即不能同時保證消息不丟和不重復(fù);
【4】發(fā)布方不知道接收方的執(zhí)行結(jié)果。

【注意事項(xiàng)】:MQ不是任何場景都能使用的,當(dāng)調(diào)用方實(shí)時依賴被調(diào)用方的執(zhí)行結(jié)果時,不能使用MQ,應(yīng)該同步調(diào)用。

六、常見的消息隊(duì)列

【1】ActiveMQ
【2】RabbitMQ
【3】ZeroMQ
【4】Kafka(日志處理)
【5】MetaMQ
【6】RocketMQ

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

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評論 19 139
  • “ 消息隊(duì)列已經(jīng)逐漸成為企業(yè)IT系統(tǒng)內(nèi)部通信的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列...
    落羽成霜丶閱讀 4,294評論 1 41
  • 作為男人的一生,是兒子也是父親。前半生兒子是父親的影子,后半生父親是兒子的影子。 --賈平凹...
    li_d620閱讀 354評論 0 0
  • 說說庫和框架的區(qū)別? JQ(Jquery,不是冰欺凌哦)就是JS的庫,打個比方,比如新買的房子需要改水電,那么就需...
    petertou閱讀 289評論 0 0
  • 1、關(guān)于自己 當(dāng)你把自己經(jīng)營到足夠好的時候 ,一切你想要的東西都會被吸引到你周圍。你若盛開,蝴蝶自來;你若精彩 ,...
    黃大俠的傳奇閱讀 392評論 0 0

友情鏈接更多精彩內(nèi)容