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

什么是消息隊(duì)列
消息隊(duì)列(Message Queue临谱,簡(jiǎn)稱MQ),指保存消息的一個(gè)容器奴璃,本質(zhì)是個(gè)隊(duì)列悉默。
消息(Message)是指在應(yīng)用之間傳送的數(shù)據(jù),消息可以非常簡(jiǎn)單苟穆,比如只包含文本字符串麦牺,也可以更復(fù)雜,可能包含嵌入對(duì)象鞭缭。
消息隊(duì)列(Message Queue)是一種應(yīng)用間的通信方式剖膳,消息發(fā)送后可以立即返回,有消息系統(tǒng)來確保信息的可靠專遞岭辣,消息發(fā)布者只管把消息發(fā)布到MQ中而不管誰來取吱晒,消息使用者只管從MQ中取消息而不管誰發(fā)布的,這樣發(fā)布者和使用者都不用知道對(duì)方的存在沦童。



?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)然近年來火熱的Kafka,從某些場(chǎng)景來說,也是MQ鲜锚,當(dāng)然kafka的功能更加強(qiáng)大突诬∩慌模【加群】:857565362
雖然不同的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)境下,由于來不及同步處理速妖,通過使用消息隊(duì)列高蜂,可以異步處理請(qǐng)求,從而緩解系統(tǒng)的壓力罕容。
舉一個(gè)訂單系統(tǒng)的例子:用戶點(diǎn)擊下訂單备恤,會(huì)觸發(fā)以下業(yè)務(wù)邏輯流程:
?扣減庫存
?生成相應(yīng)的訂單
?發(fā)短信通知等等
在業(yè)務(wù)發(fā)展初期這些邏輯可能放在一起同步執(zhí)行,隨著業(yè)務(wù)訂單量增長(zhǎng)锦秒,需要提升系統(tǒng)服務(wù)的性能露泊,這時(shí)候可以將一些不需要立即生效的操作拆分出來異步執(zhí)行,比如發(fā)短信通知等旅择,這種場(chǎng)景就可以使用消息隊(duì)列MQ惭笑。
本質(zhì)還是通過異步來解決同步的系統(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痰哨、解耦:防止引入過多的API給系統(tǒng)的穩(wěn)定性帶來風(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ā)送者無需與接收者建立連接烘豌,雙方通過消息隊(duì)列保證消息能夠從發(fā)送者路由到接收者载庭,甚至對(duì)于本來網(wǎng)絡(luò)不易互通的兩個(gè)服務(wù),也可以提供消息路由廊佩。
消息隊(duì)列的特點(diǎn)
1.異步性
將耗時(shí)的同步操作囚聚,通過以發(fā)送消息的方式,進(jìn)行了異步化處理标锄。減少了同步等待的時(shí)間顽铸。
2.松耦合
消息隊(duì)列減少了服務(wù)之間的耦合性,不同的服務(wù)可以通過消息隊(duì)列進(jìn)行通信料皇,而不用關(guān)心彼此的實(shí)現(xiàn)細(xì)節(jié)谓松,只要定義好消息的格式就行。
3.分布式
通過對(duì)消費(fèi)者的橫向擴(kuò)展践剂,降低了消息隊(duì)列阻塞的風(fēng)險(xiǎn)鬼譬,以及單個(gè)消費(fèi)者產(chǎn)生單點(diǎn)故障的可能性(
當(dāng)然消息隊(duì)列本身也可以做成分布式集群
)。
4.可靠性
消息隊(duì)列一般會(huì)把接收到的消息存儲(chǔ)到本地硬盤上(
當(dāng)消息被處理完之后逊脯,存儲(chǔ)信息根據(jù)不同的消息隊(duì)列實(shí)現(xiàn)优质,有可能將其刪除
),這樣即使應(yīng)用掛掉或者消息隊(duì)列本身掛掉男窟,消息也能夠重新加載盆赤。
消息隊(duì)列的選型
1.ActiveMQ



Apache出品,最早使用的消息隊(duì)列產(chǎn)品歉眷,時(shí)間比較長(zhǎng)了牺六,最近版本更新比較緩慢。
2.RabbitMQ

RabbitMQ是erlang語言開發(fā)汗捡,結(jié)合erlang語言本身的并發(fā)優(yōu)勢(shì)淑际,支持很多的協(xié)議:AMQP,XMPP, SMTP, STOMP扇住,也正是如此春缕,使的它變的非常重量級(jí),更適合于企業(yè)級(jí)的開發(fā)艘蹋。性能較好锄贼,但是不利于做二次開發(fā)和維護(hù)。
3.RocketMQ

阿里開源的消息中間件女阀,純Java開發(fā)宅荤,具有高吞吐量屑迂、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)冯键。
4.ZeroMQ



號(hào)稱最快的消息隊(duì)列系統(tǒng)惹盼,尤其針對(duì)大吞吐量的需求場(chǎng)景。
擴(kuò)展性好惫确,開發(fā)比較靈活手报,采用C語言實(shí)現(xiàn),實(shí)際上只是一個(gè)socket庫的重新封裝改化,如果做為消息隊(duì)列使用掩蛤,需要開發(fā)大量的代碼。
5.Kafka

Kafka是Apache下的一個(gè)子項(xiàng)目所袁,是一個(gè)高性能跨語言分布式發(fā)布/訂閱消息隊(duì)列系統(tǒng)盏档,而Jafka是在Kafka之上孵化而來的,即Kafka的一個(gè)升級(jí)版燥爷。
6.消息隊(duì)列的詳細(xì)比較

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)用解耦
使用了消息隊(duì)列后,只要保證消息格式不變橙数,消息的發(fā)送方和接收方并不需要彼此聯(lián)系尊流,也不需要受對(duì)方的影響,即解耦灯帮。
每個(gè)成員不必受其他成員影響崖技,可以更獨(dú)立自主,只通過消息隊(duì)列MQ來聯(lián)系钟哥。
舉一個(gè)例子:用戶下訂單流程迎献,下訂單后會(huì)發(fā)生扣庫存這個(gè)動(dòng)作,上游系統(tǒng)訂單和下游系統(tǒng)扣庫存腻贰,就可以通過上圖的消息隊(duì)列MQ來聯(lián)系吁恍,扣庫存異步化,從而實(shí)現(xiàn)訂單系統(tǒng)與庫存系統(tǒng)的應(yīng)用解耦。
3.流量削鋒
流量削鋒也是消息隊(duì)列中的常用場(chǎng)景践盼,一般在秒殺或團(tuán)搶活動(dòng)中使用廣泛鸦采。
應(yīng)用場(chǎng)景:秒殺活動(dòng)宾巍,一般會(huì)因?yàn)榱髁窟^大咕幻,導(dǎo)致流量暴增,應(yīng)用掛掉顶霞。為解決這個(gè)問題肄程,一般需要在應(yīng)用前端加入消息隊(duì)列。
4日志處理
日志處理是指將消息隊(duì)列用在日志處理中选浑,比如Kafka的應(yīng)用蓝厌,解決大量日志傳輸?shù)膯栴}。
5消息通訊
消息隊(duì)列一般都內(nèi)置了高效的通信機(jī)制古徒,因此也可以用于單純的消息通訊拓提,比如實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)消息隊(duì)列或者聊天室等。
我這兒整理了比較全面的JAVA相關(guān)的面試資料隧膘,
需要領(lǐng)取面試資料的同學(xué)代态,請(qǐng)加群:473984645
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疹吃,隨后出現(xiàn)的幾起案子蹦疑,更是在濱河造成了極大的恐慌,老刑警劉巖萨驶,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歉摧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腔呜,警方通過查閱死者的電腦和手機(jī)叁温,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來核畴,“玉大人膝但,你說我怎么就攤上這事√盘矗” “怎么了锰镀?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咖刃。 經(jīng)常有香客問我泳炉,道長(zhǎng),這世上最難降的妖魔是什么嚎杨? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任花鹅,我火速辦了婚禮,結(jié)果婚禮上枫浙,老公的妹妹穿的比我還像新娘刨肃。我一直安慰自己古拴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布真友。 她就那樣靜靜地躺著黄痪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盔然。 梳的紋絲不亂的頭發(fā)上桅打,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音愈案,去河邊找鬼挺尾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛站绪,可吹牛的內(nèi)容都是我干的遭铺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恢准,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼魂挂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顷歌,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤锰蓬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后眯漩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芹扭,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年赦抖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舱卡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡队萤,死狀恐怖轮锥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情要尔,我是刑警寧澤舍杜,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赵辕,受9級(jí)特大地震影響既绩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜还惠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一饲握、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦救欧、人聲如沸衰粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铝耻。三九已至,卻和暖如春骑疆,著一層夾襖步出監(jiān)牢的瞬間田篇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工箍铭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椎镣。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓诈火,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親状答。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冷守,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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