面試官:如何保證消息隊(duì)列的高可用糯彬?分析了面試官的心理后直接吊打“收下offer”

面試題

如何保證消息隊(duì)列的高可用览效?

面試官心理分析

如果有人問(wèn)到你 MQ 的知識(shí),高可用是必問(wèn)的虫几。因?yàn)镸Q 會(huì)導(dǎo)致系統(tǒng)可用性降低但校,所以只要你用了 MQ,接下來(lái)問(wèn)的一些要點(diǎn)肯定就是圍繞著 MQ 的那些缺點(diǎn)怎么來(lái)解決了啡氢。

要是你傻乎乎的就干用了一個(gè) MQ状囱,各種問(wèn)題從來(lái)沒(méi)考慮過(guò)术裸,那你就杯具了,面試官對(duì)你的感覺(jué)就是亭枷,只會(huì)簡(jiǎn)單使用一些技術(shù)袭艺,沒(méi)任何思考,馬上對(duì)你的印象就不太好了叨粘。這樣的同學(xué)招進(jìn)來(lái)要是做個(gè) 20k 薪資以?xún)?nèi)的普通小弟還湊合猾编,要是做薪資 20k+ 的高工,那就慘了升敲,讓你設(shè)計(jì)個(gè)系統(tǒng)答倡,里面肯定一堆坑,出了事故公司受損失驴党,團(tuán)隊(duì)一起背鍋瘪撇。

面試題剖析

這個(gè)問(wèn)題這么問(wèn)是很好的,因?yàn)椴荒軉?wèn)你 Kafka 的高可用性怎么保證港庄?ActiveMQ 的高可用性怎么保證设江?一個(gè)面試官要是這么問(wèn)就顯得很沒(méi)水平,人家可能用的就是 RabbitMQ攘轩,沒(méi)用過(guò) Kafka叉存,你上來(lái)問(wèn)人家 Kafka 干什么?這不是擺明了刁難人么度帮。

所以有水平的面試官歼捏,問(wèn)的是 MQ 的高可用性怎么保證?這樣就是你用過(guò)哪個(gè) MQ笨篷,你就說(shuō)說(shuō)你對(duì)那個(gè) MQ 的高可用性的理解瞳秽。

RabbitMQ 的高可用性

RabbitMQ 是比較有代表性的,因?yàn)槭?b>基于主從(非分布式)做高可用性的率翅,我們就以 RabbitMQ 為例子講解第一種 MQ 的高可用性怎么實(shí)現(xiàn)练俐。

RabbitMQ 有三種模式:?jiǎn)螜C(jī)模式、普通集群模式冕臭、鏡像集群模式腺晾。

單機(jī)模式

單機(jī)模式,就是 Demo 級(jí)別的辜贵,一般就是你本地啟動(dòng)了玩玩兒的悯蝉,沒(méi)人生產(chǎn)用單機(jī)模式。

普通集群模式(無(wú)高可用性)

普通集群模式托慨,意思就是在多臺(tái)機(jī)器上啟動(dòng)多個(gè) RabbitMQ 實(shí)例鼻由,每個(gè)機(jī)器啟動(dòng)一個(gè)。你創(chuàng)建的 queue,只會(huì)放在一個(gè) RabbitMQ 實(shí)例上蕉世,但是每個(gè)實(shí)例都同步 queue 的元數(shù)據(jù)(元數(shù)據(jù)可以認(rèn)為是 queue 的一些配置信息蔼紧,通過(guò)元數(shù)據(jù),可以找到 queue 所在實(shí)例)狠轻。你消費(fèi)的時(shí)候奸例,實(shí)際上如果連接到了另外一個(gè)實(shí)例,那么那個(gè)實(shí)例會(huì)從 queue 所在實(shí)例上拉取數(shù)據(jù)過(guò)來(lái)哈误。

這種方式確實(shí)很麻煩哩至,也不怎么好,沒(méi)做到所謂的分布式蜜自,就是個(gè)普通集群菩貌。因?yàn)檫@導(dǎo)致你要么消費(fèi)者每次隨機(jī)連接一個(gè)實(shí)例然后拉取數(shù)據(jù),要么固定連接那個(gè) queue 所在實(shí)例消費(fèi)數(shù)據(jù)重荠,前者有數(shù)據(jù)拉取的開(kāi)銷(xiāo)箭阶,后者導(dǎo)致單實(shí)例性能瓶頸

而且如果那個(gè)放 queue 的實(shí)例宕機(jī)了戈鲁,會(huì)導(dǎo)致接下來(lái)其他實(shí)例就無(wú)法從那個(gè)實(shí)例拉取仇参,如果你開(kāi)啟了消息持久化,讓 RabbitMQ 落地存儲(chǔ)消息的話(huà)婆殿,消息不一定會(huì)丟诈乒,得等這個(gè)實(shí)例恢復(fù)了,然后才可以繼續(xù)從這個(gè) queue 拉取數(shù)據(jù)婆芦。

所以這個(gè)事兒就比較尷尬了怕磨,這就沒(méi)有什么所謂的高可用性這方案主要是提高吞吐量的消约,就是說(shuō)讓集群中多個(gè)節(jié)點(diǎn)來(lái)服務(wù)某個(gè) queue 的讀寫(xiě)操作肠鲫。

鏡像集群模式(高可用性)

這種模式,才是所謂的 RabbitMQ 的高可用模式或粮。跟普通集群模式不一樣的是塔淤,在鏡像集群模式下怔锌,你創(chuàng)建的 queue炕置,無(wú)論元數(shù)據(jù)還是 queue 里的消息都會(huì)存在于多個(gè)實(shí)例上诚些,就是說(shuō),每個(gè) RabbitMQ 節(jié)點(diǎn)都有這個(gè) queue 的一個(gè)完整鏡像浓体,包含 queue 的全部數(shù)據(jù)的意思泡挺。然后每次你寫(xiě)消息到 queue 的時(shí)候,都會(huì)自動(dòng)把消息同步到多個(gè)實(shí)例的 queue 上命浴。

那么如何開(kāi)啟這個(gè)鏡像集群模式呢?其實(shí)很簡(jiǎn)單,RabbitMQ 有很好的管理控制臺(tái)生闲,就是在后臺(tái)新增一個(gè)策略媳溺,這個(gè)策略是鏡像集群模式的策略,指定的時(shí)候是可以要求數(shù)據(jù)同步到所有節(jié)點(diǎn)的碍讯,也可以要求同步到指定數(shù)量的節(jié)點(diǎn)悬蔽,再次創(chuàng)建 queue 的時(shí)候,應(yīng)用這個(gè)策略捉兴,就會(huì)自動(dòng)將數(shù)據(jù)同步到其他的節(jié)點(diǎn)上去了蝎困。

這樣的話(huà),好處在于倍啥,你任何一個(gè)機(jī)器宕機(jī)了禾乘,沒(méi)事兒,其它機(jī)器(節(jié)點(diǎn))還包含了這個(gè) queue 的完整數(shù)據(jù)虽缕,別的 consumer 都可以到其它節(jié)點(diǎn)上去消費(fèi)數(shù)據(jù)始藕。壞處在于,第一氮趋,這個(gè)性能開(kāi)銷(xiāo)也太大了吧伍派,消息需要同步到所有機(jī)器上,導(dǎo)致網(wǎng)絡(luò)帶寬壓力和消耗很重剩胁!第二诉植,這么玩兒,不是分布式的昵观,就沒(méi)有擴(kuò)展性可言了晾腔,如果某個(gè) queue 負(fù)載很重,你加機(jī)器索昂,新增的機(jī)器也包含了這個(gè) queue 的所有數(shù)據(jù)建车,并沒(méi)有辦法線(xiàn)性擴(kuò)展你的 queue。你想椒惨,如果這個(gè) queue 的數(shù)據(jù)量很大缤至,大到這個(gè)機(jī)器上的容量無(wú)法容納了,此時(shí)該怎么辦呢康谆?

Kafka 的高可用性

Kafka 一個(gè)最基本的架構(gòu)認(rèn)識(shí):由多個(gè) broker 組成领斥,每個(gè) broker 是一個(gè)節(jié)點(diǎn);你創(chuàng)建一個(gè) topic沃暗,這個(gè) topic 可以劃分為多個(gè) partition月洛,每個(gè) partition 可以存在于不同的 broker 上,每個(gè) partition 就放一部分?jǐn)?shù)據(jù)孽锥。

這就是天然的分布式消息隊(duì)列嚼黔,就是說(shuō)一個(gè) topic 的數(shù)據(jù)细层,是分散放在多個(gè)機(jī)器上的,每個(gè)機(jī)器就放一部分?jǐn)?shù)據(jù)唬涧。

實(shí)際上 RabbitMQ 之類(lèi)的疫赎,并不是分布式消息隊(duì)列,它就是傳統(tǒng)的消息隊(duì)列碎节,只不過(guò)提供了一些集群捧搞、HA(High Availability, 高可用性) 的機(jī)制而已,因?yàn)闊o(wú)論怎么玩兒狮荔,RabbitMQ 一個(gè) queue 的數(shù)據(jù)都是放在一個(gè)節(jié)點(diǎn)里的胎撇,鏡像集群下,也是每個(gè)節(jié)點(diǎn)都放這個(gè) queue 的完整數(shù)據(jù)殖氏。

Kafka 0.8 以前晚树,是沒(méi)有 HA 機(jī)制的,就是任何一個(gè) broker 宕機(jī)了受葛,那個(gè) broker 上的 partition 就廢了题涨,沒(méi)法寫(xiě)也沒(méi)法讀,沒(méi)有什么高可用性可言总滩。

比如說(shuō)纲堵,我們假設(shè)創(chuàng)建了一個(gè) topic,指定其 partition 數(shù)量是 3 個(gè)闰渔,分別在三臺(tái)機(jī)器上席函。但是,如果第二臺(tái)機(jī)器宕機(jī)了冈涧,會(huì)導(dǎo)致這個(gè) topic 的 1/3 的數(shù)據(jù)就丟了茂附,因此這個(gè)是做不到高可用的。

Kafka 0.8 以后督弓,提供了 HA 機(jī)制营曼,就是 replica(復(fù)制品) 副本機(jī)制。每個(gè) partition 的數(shù)據(jù)都會(huì)同步到其它機(jī)器上愚隧,形成自己的多個(gè) replica 副本蒂阱。所有 replica 會(huì)選舉一個(gè) leader 出來(lái),那么生產(chǎn)和消費(fèi)都跟這個(gè) leader 打交道狂塘,然后其他 replica 就是 follower录煤。寫(xiě)的時(shí)候,leader 會(huì)負(fù)責(zé)把數(shù)據(jù)同步到所有 follower 上去荞胡,讀的時(shí)候就直接讀 leader 上的數(shù)據(jù)即可妈踊。只能讀寫(xiě) leader?很簡(jiǎn)單泪漂,要是你可以隨意讀寫(xiě)每個(gè) follower廊营,那么就要 care 數(shù)據(jù)一致性的問(wèn)題歪泳,系統(tǒng)復(fù)雜度太高,很容易出問(wèn)題赘风。Kafka 會(huì)均勻地將一個(gè) partition 的所有 replica 分布在不同的機(jī)器上夹囚,這樣才可以提高容錯(cuò)性纵刘。

這么搞邀窃,就有所謂的高可用性了,因?yàn)槿绻硞€(gè) broker 宕機(jī)了假哎,沒(méi)事兒瞬捕,那個(gè) broker上面的 partition 在其他機(jī)器上都有副本的。如果這個(gè)宕機(jī)的 broker 上面有某個(gè) partition 的 leader舵抹,那么此時(shí)會(huì)從 follower 中重新選舉一個(gè)新的 leader 出來(lái)肪虎,大家繼續(xù)讀寫(xiě)那個(gè)新的 leader 即可。這就有所謂的高可用性了惧蛹。

寫(xiě)數(shù)據(jù)的時(shí)候扇救,生產(chǎn)者就寫(xiě) leader,然后 leader 將數(shù)據(jù)落地寫(xiě)本地磁盤(pán)香嗓,接著其他 follower 自己主動(dòng)從 leader 來(lái) pull 數(shù)據(jù)迅腔。一旦所有 follower 同步好數(shù)據(jù)了,就會(huì)發(fā)送 ack 給 leader靠娱,leader 收到所有 follower 的 ack 之后沧烈,就會(huì)返回寫(xiě)成功的消息給生產(chǎn)者。(當(dāng)然像云,這只是其中一種模式锌雀,還可以適當(dāng)調(diào)整這個(gè)行為)

消費(fèi)的時(shí)候,只會(huì)從 leader 去讀迅诬,但是只有當(dāng)一個(gè)消息已經(jīng)被所有 follower 都同步成功返回 ack 的時(shí)候腋逆,這個(gè)消息才會(huì)被消費(fèi)者讀到。

看到這里侈贷,相信你大致明白了 Kafka 是如何保證高可用機(jī)制的了惩歉,對(duì)吧?不至于一無(wú)所知铐维,現(xiàn)場(chǎng)還能給面試官畫(huà)畫(huà)圖柬泽。要是遇上面試官確實(shí)是 Kafka 高手,深挖了問(wèn)嫁蛇,那你只能說(shuō)不好意思锨并,太深入的你沒(méi)研究過(guò)。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睬棚,一起剝皮案震驚了整個(gè)濱河市第煮,隨后出現(xiàn)的幾起案子解幼,更是在濱河造成了極大的恐慌,老刑警劉巖包警,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撵摆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡害晦,警方通過(guò)查閱死者的電腦和手機(jī)特铝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壹瘟,“玉大人鲫剿,你說(shuō)我怎么就攤上這事〉竟欤” “怎么了灵莲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)殴俱。 經(jīng)常有香客問(wèn)我政冻,道長(zhǎng),這世上最難降的妖魔是什么线欲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任明场,我火速辦了婚禮,結(jié)果婚禮上询筏,老公的妹妹穿的比我還像新娘榕堰。我一直安慰自己,他們只是感情好嫌套,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布逆屡。 她就那樣靜靜地躺著,像睡著了一般踱讨。 火紅的嫁衣襯著肌膚如雪魏蔗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天痹筛,我揣著相機(jī)與錄音莺治,去河邊找鬼。 笑死帚稠,一個(gè)胖子當(dāng)著我的面吹牛谣旁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滋早,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼榄审,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了杆麸?” 一聲冷哼從身側(cè)響起搁进,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浪感,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饼问,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體影兽,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年莱革,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峻堰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驮吱,死狀恐怖茧妒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情左冬,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布纸型,位于F島的核電站拇砰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狰腌。R本人自食惡果不足惜除破,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琼腔。 院中可真熱鬧瑰枫,春花似錦、人聲如沸丹莲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甥材。三九已至盯另,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洲赵,已是汗流浹背鸳惯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叠萍,地道東北人芝发。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像苛谷,于是被迫代替她去往敵國(guó)和親辅鲸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355