新聞中心
1、面試官為啥要出這樣一個(gè)開(kāi)放式問(wèn)題
?這篇文章簡(jiǎn)單給大家來(lái)聊一個(gè)互聯(lián)網(wǎng)大廠的Java面試題:如果讓你設(shè)計(jì)一個(gè)消息中間件,你會(huì)怎么做?

10多年的玉屏網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整玉屏建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“玉屏網(wǎng)站設(shè)計(jì)”,“玉屏網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
其實(shí)這個(gè)問(wèn)題之前大致給大家聊過(guò),本質(zhì)就是面試官在考察一個(gè)高級(jí)以上的Java工程師的系統(tǒng)設(shè)計(jì)能力。
給你一個(gè)平時(shí)大家都常用的一個(gè)消息中間件作為命題,讓你現(xiàn)場(chǎng)開(kāi)放式發(fā)揮,立馬開(kāi)動(dòng)腦筋說(shuō)說(shuō)如果讓你來(lái)設(shè)計(jì)這么一個(gè)消息中間件。
讓你從整體架構(gòu),核心流程,數(shù)據(jù)結(jié)構(gòu),等各個(gè)層面來(lái)考慮,你會(huì)如何完成這個(gè)設(shè)計(jì)?
其實(shí)任何一個(gè)面試官都應(yīng)該知道,如果一個(gè)人沒(méi)有真的做過(guò)消息中間件開(kāi)發(fā)的話,是不太可能在短時(shí)間內(nèi),瞬間給出一套特別靠譜的架構(gòu)設(shè)計(jì)方案的。
但是用這個(gè)題目作為一個(gè)開(kāi)放式命題,他最大的好處,就是可以盡可能的挖?掘出一個(gè)候選人的較為真實(shí)的系統(tǒng)設(shè)計(jì)的能力和功底。
為什么這么說(shuō)呢?
因?yàn)槿绻嬖嚨臅r(shí)候很多東西都是一些常見(jiàn)的技術(shù)問(wèn)題,比如說(shuō):
- 消息中間件如何保證數(shù)據(jù)不丟失?
- 聊聊Elasticsearch的架構(gòu)原理以及性能優(yōu)化?
- 你們公司的微服務(wù)架構(gòu)整體如何設(shè)計(jì)的?
這些問(wèn)題相對(duì)來(lái)說(shuō)都是比較固定的一些問(wèn)題。
所謂固定的問(wèn)題,就是只要你花費(fèi)一些時(shí)間去學(xué)習(xí)了相關(guān)的技術(shù),或者是在自己所在的公司確實(shí)有過(guò)一些落地的經(jīng)驗(yàn),通常來(lái)說(shuō)回答出這些問(wèn)題就不是太大的問(wèn)題了。
但是這些問(wèn)題都不夠開(kāi)放,如果兩個(gè)候選人都同樣具備常規(guī)問(wèn)題的回答能力,那么此時(shí)通過(guò)一道有深度的開(kāi)放式問(wèn)題,就可以把幾個(gè)人里迅速拉開(kāi)差距,找出來(lái)到底誰(shuí)的技術(shù)功底更加深厚,誰(shuí)的架構(gòu)設(shè)計(jì)能力更加強(qiáng)。
那么本文就從各個(gè)角度來(lái)引導(dǎo)大家去思考一下,假如讓你回答這個(gè)問(wèn)題,你可以從哪些方面入手來(lái)現(xiàn)場(chǎng)做一些考慮和回答?
2、生產(chǎn)消費(fèi)模型以及核心數(shù)據(jù)結(jié)構(gòu)
首先第一個(gè)點(diǎn),消息中間件本身要做的就是可以允許有人來(lái)生產(chǎn)消息,還可以允許有人來(lái)消費(fèi)這個(gè)消息。
那么這里要考慮的第一個(gè)點(diǎn),就是消息中間件自己本身的核心數(shù)據(jù)結(jié)構(gòu)。
也就是說(shuō),如果有人生產(chǎn)了消息,你作為一個(gè)消息中間件,應(yīng)該如何存儲(chǔ)這個(gè)數(shù)據(jù)?
你會(huì)存儲(chǔ)在內(nèi)存里呢?還是存儲(chǔ)在磁盤(pán)文件里呢?或者兩者都同時(shí)共存?
可以先允許數(shù)據(jù)寫(xiě)入內(nèi)存作為一個(gè)緩沖,然后每隔幾秒再把數(shù)據(jù)刷入磁盤(pán)文件中?數(shù)據(jù)刷入磁盤(pán)文件之后,這個(gè)磁盤(pán)文件有多少個(gè)?
你總不能一直搞一個(gè)磁盤(pán)文件來(lái)存放所有的數(shù)據(jù)吧?那么按照什么樣的規(guī)則對(duì)磁盤(pán)文件做一個(gè)拆分?
數(shù)據(jù)寫(xiě)入磁盤(pán)文件之后,是不是要有相應(yīng)的一些metadata來(lái)標(biāo)識(shí)這個(gè)數(shù)據(jù)的具體信息?比如這個(gè)數(shù)據(jù)的offset偏移量,或者是一個(gè)內(nèi)置的唯一id?
接著現(xiàn)在數(shù)據(jù)是被存儲(chǔ)在磁盤(pán)文件里了,那么此時(shí)你如何把數(shù)據(jù)投遞到下游的消費(fèi)者里去呢?
你的消費(fèi)模型是什么樣的?比如說(shuō)一個(gè)queue里的數(shù)據(jù),是會(huì)均勻分配給消費(fèi)者的各個(gè)實(shí)例呢?還是會(huì)怎么做呢?
在這里給大家做一個(gè)提示,建議大家可以去研究研究比如kafka底層的文件存儲(chǔ)原理,那是非常經(jīng)典的高性能高并發(fā)消息中間件存儲(chǔ)架構(gòu)的實(shí)現(xiàn)。
另外就是可以參考一下rabbitmq和kafka的官網(wǎng),研究一下不同中間件的消費(fèi)模型是怎么做的。
3、支撐TB級(jí)數(shù)據(jù)寫(xiě)入的分布式架構(gòu)
接著你應(yīng)該考慮第二個(gè)大的問(wèn)題,就是你的消息中間件肯定會(huì)遇到每天TB級(jí)海量數(shù)據(jù)高并發(fā)高吞吐寫(xiě)入的場(chǎng)景。
此時(shí),你的消息中間件的架構(gòu)如何支撐呢?
所以這里你就要考慮一下,你的數(shù)據(jù)是不是要分布式的存儲(chǔ)?
比如說(shuō)假如你一天寫(xiě)入幾百TB的數(shù)據(jù),那不可能都放在一臺(tái)機(jī)器上吧?所以數(shù)據(jù)的分布式存儲(chǔ)是不是你要考慮的另外一個(gè)很重要的問(wèn)題?
你是不是要考慮把一個(gè)大的數(shù)據(jù)集合做分片存儲(chǔ),比如說(shuō)分成N片數(shù)據(jù),每個(gè)數(shù)據(jù)分片放在一臺(tái)機(jī)器上,這樣就可以充分利用多臺(tái)機(jī)器的資源來(lái)承載TB級(jí)的大量數(shù)據(jù)了。
此外你還需要考慮,你的數(shù)據(jù)分片是不是要可以支撐擴(kuò)容?
比如你一開(kāi)始設(shè)置的分片數(shù)量是10個(gè),存在10臺(tái)機(jī)器上。結(jié)果現(xiàn)在發(fā)現(xiàn)10臺(tái)機(jī)器都扛不住了,需要擴(kuò)容到20個(gè)分片,放在20臺(tái)機(jī)器上才可以。
那你是不是要支持?jǐn)?shù)據(jù)分片的擴(kuò)容以及自動(dòng)數(shù)據(jù)負(fù)載均衡遷移?也就是10個(gè)分片的數(shù)據(jù)自動(dòng)均勻分配給擴(kuò)容后的20個(gè)分片。
所以這種分布式以及可伸縮的架構(gòu),是另外一個(gè)非常核心的點(diǎn)。
我個(gè)人同樣比較建議大家研究一下kafka在這塊的架構(gòu)設(shè)計(jì),非常的優(yōu)秀,采用了partition的概念實(shí)現(xiàn)數(shù)據(jù)分片,支持分布式的數(shù)據(jù)存儲(chǔ),而且還支持動(dòng)態(tài)擴(kuò)容。
4、數(shù)據(jù)宕機(jī)場(chǎng)景下的高可用架構(gòu)
大家此時(shí)就要考慮另外一個(gè)問(wèn)題了,就是一旦數(shù)據(jù)分布式存儲(chǔ)之后,那么每臺(tái)機(jī)器上都有一部分?jǐn)?shù)據(jù)。
萬(wàn)一這臺(tái)機(jī)器宕機(jī)了呢?那么數(shù)據(jù)是不是就丟失了?
是的!所以高可用的架構(gòu)在這里就必須考慮到了。
一般分布式系統(tǒng)實(shí)現(xiàn)高可用架構(gòu),都是采用多副本冗余機(jī)制
也就是說(shuō)一份數(shù)據(jù)在多臺(tái)機(jī)器上都搞一個(gè)副本,這樣任何一臺(tái)機(jī)器宕機(jī)了,數(shù)據(jù)肯定不會(huì)丟失,你還可以繼續(xù)使用其他機(jī)器上的副本數(shù)據(jù)來(lái)支持生產(chǎn)和消費(fèi)。
同樣建議大家,研究一下kafka的多副本冗余機(jī)制,他的每個(gè)partition數(shù)據(jù)分片都是有多個(gè)副本的,任何一臺(tái)機(jī)器宕機(jī),丟失一個(gè)數(shù)據(jù)分片,還有其他機(jī)器上的副本分片在,可以支持?jǐn)?shù)據(jù)不丟失。
5、支持?jǐn)?shù)據(jù)不丟失的ack機(jī)制
最后再考慮一個(gè)問(wèn)題,你的消息中間件肯定是要支持?jǐn)?shù)據(jù)絕對(duì)不丟失的吧?
在這里你必須考慮兩塊ack機(jī)制,一個(gè)是生產(chǎn)端,一旦投遞了消息,必須要求他將數(shù)據(jù)比如寫(xiě)入多個(gè)副本之后,才返回一個(gè)ack回調(diào)響應(yīng)。
否則要是一直沒(méi)收到ack的話,就需要重發(fā)一條消息過(guò)去,保證生產(chǎn)投遞成功。
另外一個(gè)是消費(fèi)端,一旦消費(fèi)處理成功一條消息了,必須返回一個(gè)ack給消息中間件,然后消息中間件才能刪除這條消息。
否則一旦消費(fèi)者宕機(jī),就必須重發(fā)這條消息給其他的消費(fèi)者實(shí)例,保證消息一定會(huì)被處理成功。
這塊如果大家不清楚,建議一定重看之前的系列文章,我們基于rabbitmq來(lái)闡述的這個(gè)數(shù)據(jù)不丟失的全鏈路ack機(jī)制。
6、最后的總結(jié)
這種開(kāi)放式面試題,牽扯了大量的底層細(xì)節(jié)和架構(gòu)思想,非常區(qū)分不同人的技術(shù)水平。如果你往簡(jiǎn)單了回答,就本文涉及到的一些東西簡(jiǎn)單說(shuō)一說(shuō),基本也能過(guò)關(guān)。
但是如果你想技?jí)喝盒?,就必須要根?jù)本文每個(gè)部分提示的東西,真的去對(duì)各種MQ中間件的底層源碼進(jìn)行深入的研究,然后才能在回答這個(gè)問(wèn)題的時(shí)候,展現(xiàn)出“碾壓其他人”的技術(shù)功底和架構(gòu)實(shí)力。
當(dāng)前題目:程序員別死背面試八股文了,這種面試題才是未來(lái)主流
轉(zhuǎn)載源于:http://fisionsoft.com.cn/article/cohjedp.html


咨詢(xún)
建站咨詢(xún)
