分布式之消息隊(duì)列的特點(diǎn)徙赢、選型庭呜、及應(yīng)用場(chǎng)景詳解

什么是消息隊(duì)列

消息隊(duì)列(Message Queue,簡(jiǎn)稱(chēng)MQ)犀忱,指保存消息的一個(gè)容器募谎,本質(zhì)是個(gè)隊(duì)列。

消息(Message)是指在應(yīng)用之間傳送的數(shù)據(jù)阴汇,消息可以非常簡(jiǎn)單数冬,比如只包含文本字符串,也可以更復(fù)雜搀庶,可能包含嵌入對(duì)象拐纱。

消息隊(duì)列(Message Queue)是一種應(yīng)用間的通信方式,消息發(fā)送后可以立即返回哥倔,有消息系統(tǒng)來(lái)確保信息的可靠專(zhuān)遞秸架,消息發(fā)布者只管把消息發(fā)布到MQ中而不管誰(shuí)來(lái)取,消息使用者只管從MQ中取消息而不管誰(shuí)發(fā)布的咆蒿,這樣發(fā)布者和使用者都不用知道對(duì)方的存在东抹。

file
  • Producer:消息生產(chǎn)者,負(fù)責(zé)產(chǎn)生和發(fā)送消息到 Broker沃测;
  • Broker:消息處理中心缭黔。負(fù)責(zé)消息存儲(chǔ)、確認(rèn)蒂破、重試等馏谨,一般其中會(huì)包含多個(gè) queue;
  • Consumer:消息消費(fèi)者附迷,負(fù)責(zé)從 Broker 中獲取消息惧互,并進(jìn)行相應(yīng)處理;

現(xiàn)在常用的MQ組件有ActiveMQ喇伯、RabbitMQ喊儡、RocketMQ、ZeroMQ,當(dāng)然近年來(lái)火熱的Kafka,從某些場(chǎng)景來(lái)說(shuō)艘刚,也是MQ管宵,當(dāng)然kafka的功能更加強(qiáng)大截珍。

雖然不同的MQ都有自己的特點(diǎn)和優(yōu)勢(shì)攀甚,但是,不管是哪種MQ岗喉,都有MQ本身自帶的一些特點(diǎn)秋度,下面,咱們談?wù)勏㈥?duì)列的的特點(diǎn)钱床、優(yōu)勢(shì)荚斯、選型、以及應(yīng)用場(chǎng)景。

為什么需要消息隊(duì)列

在高并發(fā)分布式環(huán)境下事期,由于來(lái)不及同步處理滥壕,通過(guò)使用消息隊(duì)列,可以異步處理請(qǐng)求兽泣,從而緩解系統(tǒng)的壓力绎橘。

舉一個(gè)訂單系統(tǒng)的例子:用戶(hù)點(diǎn)擊下訂單,會(huì)觸發(fā)以下業(yè)務(wù)邏輯流程:

  • 扣減庫(kù)存
  • 生成相應(yīng)的訂單
  • 發(fā)短信通知等等

在業(yè)務(wù)發(fā)展初期這些邏輯可能放在一起同步執(zhí)行唠倦,隨著業(yè)務(wù)訂單量增長(zhǎng)称鳞,需要提升系統(tǒng)服務(wù)的性能,這時(shí)候可以將一些不需要立即生效的操作拆分出來(lái)異步執(zhí)行稠鼻,比如發(fā)短信通知等冈止,這種場(chǎng)景就可以使用消息隊(duì)列MQ。

本質(zhì)還是通過(guò)異步來(lái)解決同步的系統(tǒng)壓力候齿,所以我們?cè)谧黾軜?gòu)設(shè)計(jì)的時(shí)候有一個(gè)原則:能異步的就盡量不要同步熙暴。

消息隊(duì)列的優(yōu)點(diǎn)

1、屏蔽異構(gòu)平臺(tái)的細(xì)節(jié):發(fā)送方慌盯、接收方系統(tǒng)之間不需要了解雙方怨咪,只需認(rèn)識(shí)消息。

2润匙、異步:消息堆積能力诗眨;發(fā)送方接收方不需同時(shí)在線,發(fā)送方接收方不需同時(shí)擴(kuò)容(削峰)孕讳。

3匠楚、解耦:防止引入過(guò)多的API給系統(tǒng)的穩(wěn)定性帶來(lái)風(fēng)險(xiǎn);調(diào)用方使用不當(dāng)會(huì)給被調(diào)用方系統(tǒng)造成壓力厂财,被調(diào)用方處理不當(dāng)會(huì)降低調(diào)用方系統(tǒng)的響應(yīng)能力芋簿。

4、復(fù)用:一次發(fā)送多次消費(fèi)璃饱。

5与斤、可靠:一次保證消息的傳遞。如果發(fā)送消息時(shí)接收者不可用荚恶,消息隊(duì)列會(huì)保留消息撩穿,直到成功地傳遞它。

6谒撼、提供路由:發(fā)送者無(wú)需與接收者建立連接食寡,雙方通過(guò)消息隊(duì)列保證消息能夠從發(fā)送者路由到接收者,甚至對(duì)于本來(lái)網(wǎng)絡(luò)不易互通的兩個(gè)服務(wù)廓潜,也可以提供消息路由抵皱。

file

消息隊(duì)列的特點(diǎn)

1.異步性
將耗時(shí)的同步操作善榛,通過(guò)以發(fā)送消息的方式,進(jìn)行了異步化處理呻畸。減少了同步等待的時(shí)間移盆。

2.松耦合
消息隊(duì)列減少了服務(wù)之間的耦合性,不同的服務(wù)可以通過(guò)消息隊(duì)列進(jìn)行通信伤为,而不用關(guān)心彼此的實(shí)現(xiàn)細(xì)節(jié)味滞,只要定義好消息的格式就行。

3.分布式
通過(guò)對(duì)消費(fèi)者的橫向擴(kuò)展钮呀,降低了消息隊(duì)列阻塞的風(fēng)險(xiǎn)剑鞍,以及單個(gè)消費(fèi)者產(chǎn)生單點(diǎn)故障的可能性(當(dāng)然消息隊(duì)列本身也可以做成分布式集群)。

4.可靠性
消息隊(duì)列一般會(huì)把接收到的消息存儲(chǔ)到本地硬盤(pán)上(當(dāng)消息被處理完之后爽醋,存儲(chǔ)信息根據(jù)不同的消息隊(duì)列實(shí)現(xiàn)蚁署,有可能將其刪除),這樣即使應(yīng)用掛掉或者消息隊(duì)列本身掛掉蚂四,消息也能夠重新加載光戈。

消息隊(duì)列的選型

file

1.ActiveMQ

file

Apache出品,最早使用的消息隊(duì)列產(chǎn)品遂赠,時(shí)間比較長(zhǎng)了久妆,最近版本更新比較緩慢。

2.RabbitMQ

file

RabbitMQ是erlang語(yǔ)言開(kāi)發(fā)跷睦,結(jié)合erlang語(yǔ)言本身的并發(fā)優(yōu)勢(shì)筷弦,支持很多的協(xié)議:AMQP,XMPP, SMTP, STOMP抑诸,也正是如此烂琴,使的它變的非常重量級(jí),更適合于企業(yè)級(jí)的開(kāi)發(fā)蜕乡。性能較好奸绷,但是不利于做二次開(kāi)發(fā)和維護(hù)。

3.RocketMQ

file

阿里開(kāi)源的消息中間件层玲,純Java開(kāi)發(fā)号醉,具有高吞吐量、高可用性辛块、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)畔派。

4.ZeroMQ

file

號(hào)稱(chēng)最快的消息隊(duì)列系統(tǒng),尤其針對(duì)大吞吐量的需求場(chǎng)景憨降。

擴(kuò)展性好父虑,開(kāi)發(fā)比較靈活该酗,采用C語(yǔ)言實(shí)現(xiàn)授药,實(shí)際上只是一個(gè)socket庫(kù)的重新封裝士嚎,如果做為消息隊(duì)列使用,需要開(kāi)發(fā)大量的代碼悔叽。

5.Kafka

file

Kafka是Apache下的一個(gè)子項(xiàng)目莱衩,是一個(gè)高性能跨語(yǔ)言分布式發(fā)布/訂閱消息隊(duì)列系統(tǒng),而Jafka是在Kafka之上孵化而來(lái)的娇澎,即Kafka的一個(gè)升級(jí)版笨蚁。

6.消息隊(duì)列的詳細(xì)比較

file

7.消息隊(duì)列總結(jié)
消息隊(duì)列的選型需要根據(jù)具體應(yīng)用需求而定,ZeroMQ小而美趟庄,RabbitMQ大而穩(wěn)括细,Kakfa和RocketMQ快而強(qiáng)勁。

消息隊(duì)列的應(yīng)用場(chǎng)景

1.異步處理
消息隊(duì)列的主要特點(diǎn)是異步處理戚啥,主要目的是減少請(qǐng)求響應(yīng)時(shí)間奋单,實(shí)現(xiàn)非核心流程異步化,提高系統(tǒng)響應(yīng)性能猫十。

所以典型的使用場(chǎng)景就是將比較耗時(shí)而且不需要即時(shí)(同步)返回結(jié)果的操作览濒,作為消息放入消息隊(duì)列。

2.應(yīng)用解耦

file

使用了消息隊(duì)列后拖云,只要保證消息格式不變贷笛,消息的發(fā)送方和接收方并不需要彼此聯(lián)系,也不需要受對(duì)方的影響宙项,即解耦乏苦。

每個(gè)成員不必受其他成員影響,可以更獨(dú)立自主尤筐,只通過(guò)消息隊(duì)列MQ來(lái)聯(lián)系邑贴。

舉一個(gè)例子:用戶(hù)下訂單流程,下訂單后會(huì)發(fā)生扣庫(kù)存這個(gè)動(dòng)作叔磷,上游系統(tǒng)訂單和下游系統(tǒng)扣庫(kù)存拢驾,就可以通過(guò)上圖的消息隊(duì)列MQ來(lái)聯(lián)系,扣庫(kù)存異步化改基,從而實(shí)現(xiàn)訂單系統(tǒng)與庫(kù)存系統(tǒng)的應(yīng)用解耦繁疤。

3.流量削鋒
流量削鋒也是消息隊(duì)列中的常用場(chǎng)景,一般在秒殺或團(tuán)搶活動(dòng)中使用廣泛秕狰。

應(yīng)用場(chǎng)景:秒殺活動(dòng)稠腊,一般會(huì)因?yàn)榱髁窟^(guò)大,導(dǎo)致流量暴增鸣哀,應(yīng)用掛掉架忌。為解決這個(gè)問(wèn)題,一般需要在應(yīng)用前端加入消息隊(duì)列我衬。

4日志處理
日志處理是指將消息隊(duì)列用在日志處理中叹放,比如Kafka的應(yīng)用饰恕,解決大量日志傳輸?shù)膯?wèn)題。

5消息通訊
消息隊(duì)列一般都內(nèi)置了高效的通信機(jī)制井仰,因此也可以用于單純的消息通訊埋嵌,比如實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)消息隊(duì)列或者聊天室等。

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布俱恶!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雹嗦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子合是,更是在濱河造成了極大的恐慌了罪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪全,死亡現(xiàn)場(chǎng)離奇詭異捶惜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荔烧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)吱七,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鹤竭,你說(shuō)我怎么就攤上這事踊餐。” “怎么了臀稚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵吝岭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吧寺,道長(zhǎng)窜管,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任稚机,我火速辦了婚禮幕帆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赖条。我一直安慰自己失乾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布纬乍。 她就那樣靜靜地躺著碱茁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仿贬。 梳的紋絲不亂的頭發(fā)上纽竣,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼蜓氨。 笑死聋袋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的语盈。 我是一名探鬼主播舱馅,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缰泡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刀荒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起棘钞,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缠借,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后宜猜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泼返,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年姨拥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绅喉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叫乌,死狀恐怖柴罐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情憨奸,我是刑警寧澤革屠,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站排宰,受9級(jí)特大地震影響似芝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜板甘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一党瓮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盐类,春花似錦麻诀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至硬毕,卻和暖如春呻引,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吐咳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工逻悠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留元践,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓童谒,卻偏偏與公主長(zhǎng)得像单旁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饥伊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容