面試一線網際網路大廠?那這道題目你必須得會!

石杉的架構筆記發表於2019-02-21

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100)

週一至週五早8點半!精品技術文章準時送上!

精品學習資料獲取通道,參見文末

目錄:

  1. 面試官為啥要出這樣一個開放式問題
  2. 生產消費模型及核心資料結構
  3. 支撐TB級資料寫入的分散式架構
  4. 資料當機場景下的高可用架構
  5. 支援資料不丟失的ack機制
  6. 最後的總結

1、面試官為啥要出這樣一個開放式問題


這篇文章簡單給大家來聊一個網際網路大廠的Java面試題:如果讓你設計一個訊息中介軟體,你會怎麼做?

其實這個問題之前大致給大家聊過,本質就是面試官在考察一個高階以上的Java工程師的系統設計能力。

給你一個平時大家都常用的一個訊息中介軟體作為命題,讓你現場開放式發揮,立馬開動腦筋說說如果讓你來設計這麼一個訊息中介軟體。

讓你從整體架構,核心流程,資料結構,等各個層面來考慮,你會如何完成這個設計?

其實任何一個面試官都應該知道,如果一個人沒有真的做過訊息中介軟體開發的話,是不太可能在短時間內,瞬間給出一套特別靠譜的架構設計方案的。

但是用這個題目作為一個開放式命題,他最大的好處,就是可以儘可能的挖掘出一個候選人的較為真實的系統設計的能力和功底。

為什麼這麼說呢?

因為如果面試的時候很多東西都是一些常見的技術問題,比如說:

  • 訊息中介軟體如何保證資料不丟失?
  • 聊聊Elasticsearch的架構原理以及效能優化?
  • 你們公司的微服務架構整體如何設計的?


這些問題相對來說都是比較固定的一些問題。

所謂固定的問題,就是隻要你花費一些時間去學習了相關的技術,或者是在自己所在的公司確實有過一些落地的經驗,通常來說回答出這些問題就不是太大的問題了。

但是這些問題都不夠開放,如果兩個候選人都同樣具備常規問題的回答能力,那麼此時通過一道有深度的開放式問題,就可以把幾個人裡迅速拉開差距,找出來到底誰的技術功底更加深厚,誰的架構設計能力更加強。

那麼本文就從各個角度來引導大家去思考一下,假如讓你回答這個問題,你可以從哪些方面入手來現場做一些考慮和回答?


2、生產消費模型以及核心資料結構


首先第一個點,訊息中介軟體本身要做的就是可以允許有人來生產訊息,還可以允許有人來消費這個訊息。

那麼這裡要考慮的第一個點,就是訊息中介軟體自己本身的核心資料結構。

也就是說,如果有人生產了訊息,你作為一個訊息中介軟體,應該如何儲存這個資料?

你會儲存在記憶體裡呢?還是儲存在磁碟檔案裡呢?或者兩者都同時共存?

可以先允許資料寫入記憶體作為一個緩衝,然後每隔幾秒再把資料刷入磁碟檔案中?資料刷入磁碟檔案之後,這個磁碟檔案有多少個?

你總不能一直搞一個磁碟檔案來存放所有的資料吧?那麼按照什麼樣的規則對磁碟檔案做一個拆分?

資料寫入磁碟檔案之後,是不是要有相應的一些metadata來標識這個資料的具體資訊?比如這個資料的offset偏移量,或者是一個內建的唯一id?

接著現在資料是被儲存在磁碟檔案裡了,那麼此時你如何把資料投遞到下游的消費者裡去呢?

你的消費模型是什麼樣的?比如說一個queue裡的資料,是會均勻分配給消費者的各個例項呢?還是會怎麼做呢?

在這裡給大家做一個提示,建議大家可以去研究研究比如kafka底層的檔案儲存原理,那是非常經典的高效能高併發訊息中介軟體儲存架構的實現。

另外就是可以參考一下rabbitmq和kafka的官網,研究一下不同中介軟體的消費模型是怎麼做的。

面試一線網際網路大廠?那這道題目你必須得會!



3、支撐TB級資料寫入的分散式架構


接著你應該考慮第二個大的問題,就是你的訊息中介軟體肯定會遇到每天TB級海量資料高併發高吞吐寫入的場景。

此時,你的訊息中介軟體的架構如何支撐呢?

所以這裡你就要考慮一下,你的資料是不是要分散式的儲存

比如說假如你一天寫入幾百TB的資料,那不可能都放在一臺機器上吧?所以資料的分散式儲存是不是你要考慮的另外一個很重要的問題?

你是不是要考慮把一個大的資料集合做分片儲存,比如說分成N片資料,每個資料分片放在一臺機器上,這樣就可以充分利用多臺機器的資源來承載TB級的大量資料了。

此外你還需要考慮,你的資料分片是不是要可以支撐擴容?

比如你一開始設定的分片數量是10個,存在10臺機器上。結果現在發現10臺機器都扛不住了,需要擴容到20個分片,放在20臺機器上才可以。

那你是不是要支援資料分片的擴容以及自動資料負載均衡遷移?也就是10個分片的資料自動均勻分配給擴容後的20個分片。

所以這種分散式以及可伸縮的架構,是另外一個非常核心的點。

我個人同樣比較建議大家研究一下kafka在這塊的架構設計,非常的優秀,採用了partition的概念實現資料分片,支援分散式的資料儲存,而且還支援動態擴容。

面試一線網際網路大廠?那這道題目你必須得會!


4、資料當機場景下的高可用架構


大家此時就要考慮另外一個問題了,就是一旦資料分散式儲存之後,那麼每臺機器上都有一部分資料。

萬一這臺機器當機了呢?那麼資料是不是就丟失了?

是的!所以高可用的架構在這裡就必須考慮到了。

一般分散式系統實現高可用架構,都是採用多副本冗餘機制

也就是說一份資料在多臺機器上都搞一個副本,這樣任何一臺機器當機了,資料肯定不會丟失,你還可以繼續使用其他機器上的副本資料來支援生產和消費。

同樣建議大家,研究一下kafka的多副本冗餘機制,他的每個partition資料分片都是有多個副本的,任何一臺機器當機,丟失一個資料分片,還有其他機器上的副本分片在,可以支援資料不丟失。

面試一線網際網路大廠?那這道題目你必須得會!



5、支援資料不丟失的ack機制


最後再考慮一個問題,你的訊息中介軟體肯定是要支援資料絕對不丟失的吧?

那麼你必須要支援生產端和消費端的ack機制,這塊內容我們之前都用多篇文章講解過裡面的具體的原理,大家可以參考一下:

在這裡你必須考慮兩塊ack機制,一個是生產端,一旦投遞了訊息,必須要求他將資料比如寫入多個副本之後,才返回一個ack回撥響應。

否則要是一直沒收到ack的話,就需要重發一條訊息過去,保證生產投遞成功。

另外一個是消費端,一旦消費處理成功一條訊息了,必須返回一個ack給訊息中介軟體,然後訊息中介軟體才能刪除這條訊息。

否則一旦消費者當機,就必須重發這條訊息給其他的消費者例項,保證訊息一定會被處理成功。

這塊如果大家不清楚,建議一定重看之前的系列文章,我們基於rabbitmq來闡述的這個資料不丟失的全鏈路ack機制。

面試一線網際網路大廠?那這道題目你必須得會!



6、最後的總結


這種開放式面試題,牽扯了大量的底層細節和架構思想,非常區分不同人的技術水平。如果你往簡單了回答,就本文涉及到的一些東西簡單說一說,基本也能過關。

但是如果你想技壓群雄,就必須要根據本文每個部分提示的東西,真的去對各種MQ中介軟體的底層原始碼進行深入的研究,然後才能在回答這個問題的時候,展現出“碾壓其他人”的技術功底和架構實力。



End

(封面圖源網路,侵權刪除)


掃描下方二維碼,備註:“資料”,獲取更多“祕製” 精品學習資料

面試一線網際網路大廠?那這道題目你必須得會!

如有收穫,請幫忙轉發,您的鼓勵是作者最大的動力,謝謝!

一大波微服務、分散式、高併發、高可用的原創系列文章正在路上

歡迎掃描下方二維碼,持續關注:

面試一線網際網路大廠?那這道題目你必須得會!

石杉的架構筆記(id:shishan100)

十餘年BAT架構經驗傾囊相授

推薦閱讀:

1、拜託!面試請不要再問我Spring Cloud底層原理

2、【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級訪問?

3、【效能優化之道】每秒上萬併發下的Spring Cloud引數優化實戰

4、微服務架構如何保障雙11狂歡下的99.99%高可用

5、兄弟,用大白話告訴你小白都能聽懂的Hadoop架構原理

6、大規模叢集下Hadoop NameNode如何承載每秒上千次的高併發訪問

7、【效能優化的祕密】Hadoop如何將TB級大檔案的上傳效能優化上百倍

8、拜託,面試請不要再問我TCC分散式事務的實現原理!

9、【坑爹呀!】最終一致性分散式事務如何保障實際生產中99.99%高可用?

10、拜託,面試請不要再問我Redis分散式鎖的實現原理!

11、【眼前一亮!】看Hadoop底層演算法如何優雅的將大規模叢集效能提升10倍以上?

12、億級流量系統架構之如何支撐百億級資料的儲存與計算

13、億級流量系統架構之如何設計高容錯分散式計算系統

14、億級流量系統架構之如何設計承載百億流量的高效能架構

15、億級流量系統架構之如何設計每秒十萬查詢的高併發架構

16、億級流量系統架構之如何設計全鏈路99.99%高可用架構

17、七張圖徹底講清楚ZooKeeper分散式鎖的實現原理

18、大白話聊聊Java併發面試問題之volatile到底是什麼?

19、大白話聊聊Java併發面試問題之Java 8如何優化CAS效能?

20、大白話聊聊Java併發面試問題之談談你對AQS的理解?

21、大白話聊聊Java併發面試問題之公平鎖與非公平鎖是啥?

22、大白話聊聊Java併發面試問題之微服務註冊中心的讀寫鎖優化

23、網際網路公司的面試官是如何360°無死角考察候選人的?(上篇)

24、網際網路公司面試官是如何360°無死角考察候選人的?(下篇)

25、Java進階面試系列之一:哥們,你們的系統架構中為什麼要引入訊息中介軟體?

26、【Java進階面試系列之二】:哥們,那你說說系統架構引入訊息中介軟體有什麼缺點?

27、【行走的Offer收割機】記一位朋友斬獲BAT技術專家Offer的面試經歷

28、【Java進階面試系列之三】哥們,訊息中介軟體在你們專案裡是如何落地的?

29、【Java進階面試系列之四】扎心!線上服務當機時,如何保證資料100%不丟失?

30、一次JVM FullGC的背後,竟隱藏著驚心動魄的線上生產事故!

31、【高併發優化實踐】10倍請求壓力來襲,你的系統會被擊垮嗎?

32、【Java進階面試系列之五】訊息中介軟體叢集崩潰,如何保證百萬生產資料不丟失?

33、億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(上)?

34、億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(中)?

35、億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(下)?

36、億級流量架構第二彈:你的系統真的無懈可擊嗎?

37、億級流量系統架構之如何保證百億流量下的資料一致性(上)

38、億級流量系統架構之如何保證百億流量下的資料一致性(中)?

39、億級流量系統架構之如何保證百億流量下的資料一致性(下)?

40、網際網路面試必殺:如何保證訊息中介軟體全鏈路資料100%不丟失(1)

41、網際網路面試必殺:如何保證訊息中介軟體全鏈路資料100%不丟失(2

42、面試大殺器:訊息中介軟體如何實現消費吞吐量的百倍優化?

43、高併發場景下,如何保證生產者投遞到訊息中介軟體的訊息不丟失?

44、兄弟,用大白話給你講小白都能看懂的分散式系統容錯架構

45、從團隊自研的百萬併發中介軟體系統的核心設計看Java併發效能優化

46、【非廣告,純乾貨】英語差的程式設計師如何才能無障礙閱讀官方文件?

47、如果20萬使用者同時訪問一個熱點快取,如何優化你的快取架構?

48、【非廣告,純乾貨】中小公司的Java工程師應該如何逆襲衝進BAT?

49、拜託,面試請不要再問我分散式搜尋引擎的架構原理!

50、【金三銀四跳槽季】Java工程師如何在1個月內做好面試準備?

51、【offer收割機必備】我簡歷上的Java專案都好low,怎麼辦?

52、【offer去哪了】我一連面試了十個Java崗,統統石沉大海!

53、高階Java開發必備:分散式系統的唯一id生成演算法你瞭解嗎?

54、支撐日活百萬使用者的高併發系統,應該如何設計其資料庫架構?


作者:石杉的架構筆記
連結:https://juejin.im/post/5c6a9f25518825787e69e70a
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。



相關文章