為什么使用消息隊(duì)列价匠?消息隊(duì)列有什么優(yōu)點(diǎn)和缺點(diǎn)当纱?Kafka、ActiveMQ踩窖、RabbitMQ坡氯、RocketMQ 都有什么優(yōu)點(diǎn)和缺點(diǎn)?

  • 面試題

  • 為什么使用消息隊(duì)列洋腮?

  • 消息隊(duì)列有什么優(yōu)點(diǎn)和缺點(diǎn)箫柳?

  • Kafka、ActiveMQ啥供、RabbitMQ悯恍、RocketMQ 都有什么區(qū)別,以及適合哪些場(chǎng)景伙狐?

面試官心理分析

其實(shí)面試官主要是想看看:

  • 第一涮毫,你知不知道你們系統(tǒng)里為什么要用消息隊(duì)列這個(gè)東西? 不少候選人贷屎,說(shuō)自己項(xiàng)目里用了 Redis罢防、MQ,但是其實(shí)他并不知道自己為什么要用這個(gè)東西唉侄。其實(shí)說(shuō)白了篙梢,就是為了用而用,或者是別人設(shè)計(jì)的架構(gòu)美旧,他從頭到尾都沒思考過(guò)渤滞。 沒有對(duì)自己的架構(gòu)問過(guò)為什么的人,一定是平時(shí)沒有思考的人榴嗅,面試官對(duì)這類候選人印象通常很不好妄呕。因?yàn)槊嬖嚬贀?dān)心你進(jìn)了團(tuán)隊(duì)之后只會(huì)木頭木腦的干呆活兒,不會(huì)自己思考嗽测。

  • 第二绪励,你既然用了消息隊(duì)列這個(gè)東西肿孵,你知不知道用了有什么好處&壞處? 你要是沒考慮過(guò)這個(gè)疏魏,那你盲目弄個(gè) MQ 進(jìn)系統(tǒng)里停做,后面出了問題你是不是就自己溜了給公司留坑?你要是沒考慮過(guò)引入一個(gè)技術(shù)可能存在的弊端和風(fēng)險(xiǎn)大莫,面試官把這類候選人招進(jìn)來(lái)了蛉腌,基本可能就是挖坑型選手。就怕你干 1 年挖一堆坑只厘,自己跳槽了烙丛,給公司留下無(wú)窮后患。

  • 第三羔味,既然你用了 MQ河咽,可能是某一種 MQ,那么你當(dāng)時(shí)做沒做過(guò)調(diào)研赋元? 你別傻乎乎的自己拍腦袋看個(gè)人喜好就瞎用了一個(gè) MQ忘蟹,比如 Kafka,甚至都從沒調(diào)研過(guò)業(yè)界流行的 MQ 到底有哪幾種搁凸。每一個(gè) MQ 的優(yōu)點(diǎn)和缺點(diǎn)是什么媚值。每一個(gè) MQ 沒有絕對(duì)的好壞,但是就是看用在哪個(gè)場(chǎng)景可以揚(yáng)長(zhǎng)避短坪仇,利用其優(yōu)勢(shì),規(guī)避其劣勢(shì)垃你。 如果是一個(gè)不考慮技術(shù)選型的候選人招進(jìn)了團(tuán)隊(duì)椅文,leader 交給他一個(gè)任務(wù),去設(shè)計(jì)個(gè)什么系統(tǒng)惜颇,他在里面用一些技術(shù)皆刺,可能都沒考慮過(guò)選型,最后選的技術(shù)可能并不一定合適凌摄,一樣是留坑羡蛾。

面試題剖析

為什么使用消息隊(duì)列

其實(shí)就是問問你消息隊(duì)列都有哪些使用場(chǎng)景,然后你項(xiàng)目里具體是什么場(chǎng)景锨亏,說(shuō)說(shuō)你在這個(gè)場(chǎng)景里用消息隊(duì)列是什么痴怨?

面試官問你這個(gè)問題,期望的一個(gè)回答是說(shuō)器予,你們公司有個(gè)什么業(yè)務(wù)場(chǎng)景浪藻,這個(gè)業(yè)務(wù)場(chǎng)景有個(gè)什么技術(shù)挑戰(zhàn),如果不用 MQ 可能會(huì)很麻煩乾翔,但是你現(xiàn)在用了 MQ 之后帶給了你很多的好處爱葵。

先說(shuō)一下消息隊(duì)列常見的使用場(chǎng)景吧,其實(shí)場(chǎng)景有很多,但是比較核心的有 3 個(gè):解耦萌丈、異步赞哗、削峰。

解耦

看這么個(gè)場(chǎng)景辆雾。A 系統(tǒng)發(fā)送數(shù)據(jù)到 BCD 三個(gè)系統(tǒng)肪笋,通過(guò)接口調(diào)用發(fā)送。如果 E 系統(tǒng)也要這個(gè)數(shù)據(jù)呢乾颁?那如果 C 系統(tǒng)現(xiàn)在不需要了呢涂乌?A 系統(tǒng)負(fù)責(zé)人幾乎崩潰......

在這個(gè)場(chǎng)景中,A 系統(tǒng)跟其它各種亂七八糟的系統(tǒng)嚴(yán)重耦合英岭,A 系統(tǒng)產(chǎn)生一條比較關(guān)鍵的數(shù)據(jù)湾盒,很多系統(tǒng)都需要 A 系統(tǒng)將這個(gè)數(shù)據(jù)發(fā)送過(guò)來(lái)。A 系統(tǒng)要時(shí)時(shí)刻刻考慮 BCDE 四個(gè)系統(tǒng)如果掛了該咋辦诅妹?要不要重發(fā)罚勾,要不要把消息存起來(lái)?頭發(fā)都白了翱越啤尖殃!

如果使用 MQ,A 系統(tǒng)產(chǎn)生一條數(shù)據(jù)划煮,發(fā)送到 MQ 里面去送丰,哪個(gè)系統(tǒng)需要數(shù)據(jù)自己去 MQ 里面消費(fèi)。如果新系統(tǒng)需要數(shù)據(jù)弛秋,直接從 MQ 里消費(fèi)即可器躏;如果某個(gè)系統(tǒng)不需要這條數(shù)據(jù)了,就取消對(duì) MQ 消息的消費(fèi)即可蟹略。這樣下來(lái)登失,A 系統(tǒng)壓根兒不需要去考慮要給誰(shuí)發(fā)送數(shù)據(jù)挖炬,不需要維護(hù)這個(gè)代碼揽浙,也不需要考慮人家是否調(diào)用成功、失敗超時(shí)等情況意敛。

總結(jié):通過(guò)一個(gè) MQ馅巷,Pub/Sub 發(fā)布訂閱消息這么一個(gè)模型,A 系統(tǒng)就跟其它系統(tǒng)徹底解耦了草姻。

面試技巧:你需要去考慮一下你負(fù)責(zé)的系統(tǒng)中是否有類似的場(chǎng)景令杈,就是一個(gè)系統(tǒng)或者一個(gè)模塊,調(diào)用了多個(gè)系統(tǒng)或者模塊碴倾,互相之間的調(diào)用很復(fù)雜逗噩,維護(hù)起來(lái)很麻煩掉丽。但是其實(shí)這個(gè)調(diào)用是不需要直接同步調(diào)用接口的,如果用 MQ 給它異步化解耦异雁,也是可以的捶障,你就需要去考慮在你的項(xiàng)目里,是不是可以運(yùn)用這個(gè) MQ 去進(jìn)行系統(tǒng)的解耦纲刀。在簡(jiǎn)歷中體現(xiàn)出來(lái)這塊東西项炼,用 MQ 作解耦。

異步

再來(lái)看一個(gè)場(chǎng)景示绊,A 系統(tǒng)接收一個(gè)請(qǐng)求锭部,需要在自己本地寫庫(kù),還需要在 BCD 三個(gè)系統(tǒng)寫庫(kù)面褐,自己本地寫庫(kù)要 3ms拌禾,BCD 三個(gè)系統(tǒng)分別寫庫(kù)要 300ms、450ms展哭、200ms湃窍。最終請(qǐng)求總延時(shí)是 3 + 300 + 450 + 200 = 953ms,接近 1s匪傍,用戶感覺搞個(gè)什么東西您市,慢死了慢死了。用戶通過(guò)瀏覽器發(fā)起請(qǐng)求役衡,等待個(gè) 1s茵休,這幾乎是不可接受的。

一般互聯(lián)網(wǎng)類的企業(yè)手蝎,對(duì)于用戶直接的操作榕莺,一般要求是每個(gè)請(qǐng)求都必須在 200 ms 以內(nèi)完成,對(duì)用戶幾乎是無(wú)感知的柑船。

如果使用 MQ帽撑,那么 A 系統(tǒng)連續(xù)發(fā)送 3 條消息到 MQ 隊(duì)列中泼各,假如耗時(shí) 5ms鞍时,A 系統(tǒng)從接受一個(gè)請(qǐng)求到返回響應(yīng)給用戶,總時(shí)長(zhǎng)是 3 + 5 = 8ms扣蜻,對(duì)于用戶而言逆巍,其實(shí)感覺上就是點(diǎn)個(gè)按鈕,8ms 以后就直接返回了莽使,爽锐极!網(wǎng)站做得真好,真快芳肌!

削峰

每天 0:00 到 12:00灵再,A 系統(tǒng)風(fēng)平浪靜肋层,每秒并發(fā)請(qǐng)求數(shù)量就 50 個(gè)。結(jié)果每次一到 12:00 ~ 13:00 翎迁,每秒并發(fā)請(qǐng)求數(shù)量突然會(huì)暴增到 5k+ 條栋猖。但是系統(tǒng)是直接基于 MySQL 的,大量的請(qǐng)求涌入 MySQL汪榔,每秒鐘對(duì) MySQL 執(zhí)行約 5k 條 SQL蒲拉。

一般的 MySQL,扛到每秒 2k 個(gè)請(qǐng)求就差不多了痴腌,如果每秒請(qǐng)求到 5k 的話雌团,可能就直接把 MySQL 給打死了,導(dǎo)致系統(tǒng)崩潰士聪,用戶也就沒法再使用系統(tǒng)了锦援。

但是高峰期一過(guò),到了下午的時(shí)候戚嗅,就成了低峰期雨涛,可能也就 1w 的用戶同時(shí)在網(wǎng)站上操作,每秒中的請(qǐng)求數(shù)量可能也就 50 個(gè)請(qǐng)求懦胞,對(duì)整個(gè)系統(tǒng)幾乎沒有任何的壓力替久。

如果使用 MQ,每秒 5k 個(gè)請(qǐng)求寫入 MQ躏尉,A 系統(tǒng)每秒鐘最多處理 2k 個(gè)請(qǐng)求蚯根,因?yàn)?MySQL 每秒鐘最多處理 2k 個(gè)。A 系統(tǒng)從 MQ 中慢慢拉取請(qǐng)求胀糜,每秒鐘就拉取 2k 個(gè)請(qǐng)求颅拦,不要超過(guò)自己每秒能處理的最大請(qǐng)求數(shù)量就 ok,這樣下來(lái)教藻,哪怕是高峰期的時(shí)候距帅,A 系統(tǒng)也絕對(duì)不會(huì)掛掉。而 MQ 每秒鐘 5k 個(gè)請(qǐng)求進(jìn)來(lái)括堤,就 2k 個(gè)請(qǐng)求出去碌秸,結(jié)果就導(dǎo)致在中午高峰期(1 個(gè)小時(shí)),可能有幾十萬(wàn)甚至幾百萬(wàn)的請(qǐng)求積壓在 MQ 中悄窃。

這個(gè)短暫的高峰期積壓是 ok 的讥电,因?yàn)楦叻迤谶^(guò)了之后,每秒鐘就 50 個(gè)請(qǐng)求進(jìn) MQ轧抗,但是 A 系統(tǒng)依然會(huì)按照每秒 2k 個(gè)請(qǐng)求的速度在處理恩敌。所以說(shuō),只要高峰期一過(guò)横媚,A 系統(tǒng)就會(huì)快速將積壓的消息給解決掉纠炮。

消息隊(duì)列有什么優(yōu)缺點(diǎn)

優(yōu)點(diǎn)上面已經(jīng)說(shuō)了月趟,就是在特殊場(chǎng)景下有其對(duì)應(yīng)的好處,解耦恢口、異步狮斗、削峰。

缺點(diǎn)有以下幾個(gè):

  • 系統(tǒng)可用性降低 系統(tǒng)引入的外部依賴越多弧蝇,越容易掛掉碳褒。本來(lái)你就是 A 系統(tǒng)調(diào)用 BCD 三個(gè)系統(tǒng)的接口就好了,ABCD 四個(gè)系統(tǒng)還好好的看疗,沒啥問題沙峻,你偏加個(gè) MQ 進(jìn)來(lái),萬(wàn)一 MQ 掛了咋整两芳?MQ 一掛摔寨,整套系統(tǒng)崩潰,你不就完了怖辆?如何保證消息隊(duì)列的高可用是复,可以點(diǎn)擊這里查看

  • 系統(tǒng)復(fù)雜度提高 硬生生加個(gè) MQ 進(jìn)來(lái),你怎么保證消息沒有重復(fù)消費(fèi)怎么處理消息丟失的情況怎么保證消息傳遞的順序性竖螃?頭大頭大淑廊,問題一大堆,痛苦不已特咆。

  • 一致性問題 A 系統(tǒng)處理完了直接返回成功了季惩,人都以為你這個(gè)請(qǐng)求就成功了;但是問題是腻格,要是 BCD 三個(gè)系統(tǒng)那里画拾,BD 兩個(gè)系統(tǒng)寫庫(kù)成功了,結(jié)果 C 系統(tǒng)寫庫(kù)失敗了菜职,咋整青抛?你這數(shù)據(jù)就不一致了。 所以消息隊(duì)列實(shí)際是一種非常復(fù)雜的架構(gòu)酬核,你引入它有很多好處蜜另,但是也得針對(duì)它帶來(lái)的壞處做各種額外的技術(shù)方案和架構(gòu)來(lái)規(guī)避掉,做好之后愁茁,你會(huì)發(fā)現(xiàn)蚕钦,媽呀亭病,系統(tǒng)復(fù)雜度提升了一個(gè)數(shù)量級(jí)鹅很,也許是復(fù)雜了 10 倍。但是關(guān)鍵時(shí)刻罪帖,用促煮,還是得用的邮屁。

Kafka、ActiveMQ菠齿、RabbitMQ佑吝、RocketMQ 有什么優(yōu)缺點(diǎn)?

綜上绳匀,各種對(duì)比之后芋忿,有如下建議:

一般的業(yè)務(wù)系統(tǒng)要引入 MQ,最早大家都用 ActiveMQ疾棵,但是現(xiàn)在確實(shí)大家用的不多了戈钢,沒經(jīng)過(guò)大規(guī)模吞吐量場(chǎng)景的驗(yàn)證,社區(qū)也不是很活躍是尔,所以大家還是算了吧殉了,我個(gè)人不推薦用這個(gè)了。

后來(lái)大家開始用 RabbitMQ拟枚,但是確實(shí) erlang 語(yǔ)言阻止了大量的 Java 工程師去深入研究和掌控它薪铜,對(duì)公司而言,幾乎處于不可控的狀態(tài)恩溅,但是確實(shí)人家是開源的隔箍,比較穩(wěn)定的支持,活躍度也高脚乡。

不過(guò)現(xiàn)在確實(shí)越來(lái)越多的公司會(huì)去用 RocketMQ鞍恢,確實(shí)很不錯(cuò),畢竟是阿里出品每窖,但社區(qū)可能有突然黃掉的風(fēng)險(xiǎn)(目前 RocketMQ 已捐給 Apache帮掉,但 GitHub 上的活躍度其實(shí)不算高)對(duì)自己公司技術(shù)實(shí)力有絕對(duì)自信的,推薦用 RocketMQ窒典,否則回去老老實(shí)實(shí)用 RabbitMQ 吧蟆炊,人家有活躍的開源社區(qū),絕對(duì)不會(huì)黃瀑志。

所以中小型公司涩搓,技術(shù)實(shí)力較為一般,技術(shù)挑戰(zhàn)不是特別高劈猪,用 RabbitMQ 是不錯(cuò)的選擇昧甘;大型公司,基礎(chǔ)架構(gòu)研發(fā)實(shí)力較強(qiáng)战得,用 RocketMQ 是很好的選擇充边。

如果是大數(shù)據(jù)領(lǐng)域的實(shí)時(shí)計(jì)算、日志采集等場(chǎng)景,用 Kafka 是業(yè)內(nèi)標(biāo)準(zhǔn)的浇冰,絕對(duì)沒問題贬媒,社區(qū)活躍度很高,絕對(duì)不會(huì)黃肘习,何況幾乎是全世界這個(gè)領(lǐng)域的事實(shí)性規(guī)范际乘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漂佩,隨后出現(xiàn)的幾起案子脖含,更是在濱河造成了極大的恐慌,老刑警劉巖投蝉,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器赞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡墓拜,警方通過(guò)查閱死者的電腦和手機(jī)港柜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咳榜,“玉大人夏醉,你說(shuō)我怎么就攤上這事∮亢” “怎么了畔柔?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)臣樱。 經(jīng)常有香客問我靶擦,道長(zhǎng),這世上最難降的妖魔是什么雇毫? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任玄捕,我火速辦了婚禮,結(jié)果婚禮上棚放,老公的妹妹穿的比我還像新娘枚粘。我一直安慰自己,他們只是感情好飘蚯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布馍迄。 她就那樣靜靜地躺著,像睡著了一般局骤。 火紅的嫁衣襯著肌膚如雪攀圈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天峦甩,我揣著相機(jī)與錄音赘来,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撕捍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泣洞,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼忧风,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了球凰?” 一聲冷哼從身側(cè)響起狮腿,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呕诉,沒想到半個(gè)月后缘厢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甩挫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年贴硫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伊者。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡英遭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亦渗,到底是詐尸還是另有隱情挖诸,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布法精,位于F島的核電站多律,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搂蜓。R本人自食惡果不足惜狼荞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帮碰。 院中可真熱鬧粘秆,春花似錦、人聲如沸收毫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)此再。三九已至昔搂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間输拇,已是汗流浹背摘符。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逛裤。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓瘩绒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親带族。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锁荔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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