做者: 石杉的架構筆記面試
1、寫在前面數據庫
最近收到很多讀者反饋,說本身在應聘一些中大型互聯網公司的Java工程師崗位時遇到了很多困惑。緩存
這些同窗說本身也作了精心準備,網上搜集了很多Java面試題,然而實際去互聯網公司面試才發現,人家問的,和你準備的對不上號,這就很尷尬了。性能優化
2、先來體驗一個真實的面試連環炮網絡
好,閒話很少說,咱們進入正題!架構
本系列文章,咱們將會從消息中間件、分佈式緩存、分佈式搜索、分佈式架構、海量數據、NoSQL、高併發、高可用、高性能、數據庫、JVM虛擬機等各方面聊一下面試中的高頻技術問題。併發
如今一些中大型互聯網公司的面試官,在面試候選人時,通常都會採起連環炮的策略來深挖一個候選人的技術水平。框架
舉個例子,好比說看你簡歷上寫了熟悉消息中間件(MQ技術)。那麼可能咱們就會有一個相似下面這樣的連環炮式發問:機器學習
說說大家公司線上生產環境用的是什麼消息中間件?分佈式
那大家線上系統是有哪些技術挑戰,爲何必需要在系統裏引入消息中間件?
大家的消息中間件技術選型爲何是RabbitMQ?
爲何不用RocketMQ或者是Kafka?技術選型的依據是什麼?
大家怎麼保證消息中間件的高可用性?避免消息中間件故障後引起系統總體故障?
使用消息中間件技術的時候,大家怎麼保證投遞出去的消息必定不會丟失?
大家怎麼保證投遞出去的消息只有一條且僅僅一條,不會出現重複的數據?
若是消費了重複的消息怎麼保證數據的準確性?
大家線上業務用消息中間件的時候,是否須要保證消息的順序性?
若是不須要保證消息順序,爲何不須要?假如我有一個場景要保證消息的順序,大家應該如何保證?
下游消費系統若是宕機了,致使幾百萬條消息在消息中間件裏積壓,此時怎麼處理?
大家線上是否遇到過消息積壓的生產故障?若是沒遇到過,你考慮一下如何應對?
大家用的是RabbitMQ?那你說說RabbitMQ的底層架構原理,邏輯架構、物理架構以及數據持久化機制?
大家RabbitMQ的最高峯QPS每秒是多少?線上如何部署的,部署了多少臺機器,機器的配置如何?
大家用的是Kafka?那你說說Kafka的底層架構原理,磁盤上數據如何存儲的,總體分佈式架構是如何實現的?
再說說Kafka是如何保證數據的高容錯性的?零拷貝等技術是如何運用的?高吞吐量下如何優化生產者和消費者的性能?
看過Kafka的源碼沒有。若是看過,說說你對Kafka源碼的理解?
大家用的是RocketMQ?RocketMQ很大的一個特色是對分佈式事務的支持,你說說他在分佈式事務支持這塊機制的底層原理?
RocketMQ的源碼看過麼,聊聊你對RocketMQ源碼的理解?
若是讓你來動手實現一個分佈式消息中間件,總體架構你會如何設計實現?
上面僅僅是MQ相關技術問題的一部分,實際上,一個比較好的面試官的問題,就是從技術面、技術點、項目實踐幾塊來抽絲剝繭的發問。
3、技術廣度的考察
首先考察候選人技術面的完整性,由於工做中是須要具有必定的技術視野的,不能說光知道消息中間件,可是分佈式緩存卻一無所知。
相似於之前高考的時候,你語文特別好,結果物理特別差,那也是不太合適的。
因此工程師首先要避免本身的技術短板,尤爲是三到五年經驗的同窗,已經完全度過了本身人生的職場生涯的初期小白入門菜鳥階段。
因此,務必在工做三到五年的時候,保證本身的技術絕對沒有任何短板,總體技術棧要或多或少都知道一些,不能出現盲區。
好比,我如今問你,大家公司有沒有什麼業務場景是能夠用NoSQL的?如今國內各個公司用NoSQL的技術都有哪些選型?具體NoSQL能夠解決什麼問題?
若是你一問三不知,這就是典型的技術短板,你至少須要大概知道,每一個技術通常在什麼狀況下用,怎麼來用,解決的是什麼問題。
所以,上面說的消息中間件、分佈式緩存、海量數據、分佈式搜索、NoSQL、分佈式架構、高併發、高可用、高性能這些技術。並非說真的要求工做幾年的同窗都要精通到源碼層面。
而是說你工做幾年之後,應該有必定的技術廣度,開闊的技術視野。
4、底層技術的考察
如今不少互聯網大廠都會有基本功的考察,舉個例子,Java虛擬機的核心原理、內存模型、垃圾回收、線上FullGC卡頓性能優化、線上OOM內存溢出問題你處理。
Java併發中的volatile、鎖優化、AQS源碼;
Netty背後的IO、網絡相關的知識。
其實這種底層技術,是線上高負載大型系統的架構設計和開發,必需要具有的。
由於底層技術不紮實,不少中間件或其餘高階的技術,都沒法深刻理解其原理。
並且不少時候,解決線上系統的生產故障,都須要這些技術。所以,底層技術的掌握是一個優秀工程師必須具有的素養。
5、技術深度的考察
此外,咱們必定會深刻考察候選人平時工做中熟悉的以及經常使用的一些技術。
舉個例子,好比你項目裏用了Redis或者是Elasticsearch。
只要你用過了,並且是你某個項目裏的核心技術,那麼必定會用連環炮式的發問,深刻各類細節、底層、生產環境可能遇到的技術挑戰。
總之,就是要用壓力測試出來你在這塊技術水平掌握的到底有多深,實踐經驗有多強。
一個好的面試官,本身自己技術功底紮實,是能夠對一個技術問出一連串的連環炮的,就好比上面的那個消息中間件的連環炮發問。
並且只要面試官在一個技術上的深度超過候選人,那麼經過不斷加深的發問,是能夠考察出來一個候選人在本身最熟悉的技術領域的技術深度的。
舉個例子,好比說你對一個技術的掌握是否達到了源碼級別?
是否對某個框架,或者是中間件深刻的理解底層的源碼實現,從源碼級別說清楚他的架構原理?
是否對這個技術有過線上的高可用部署,承載太高併發流量的訪問?
是否對這個技術在線上生產環境解決過各類各樣的複雜技術挑戰?
是否基於這個技術落地到你的業務系統中,設計出各類複雜的系統架構?
經過這種連環炮,能夠很是好的考察出某個候選人對技術深度的掌握。
技術深度的考察是中大型互聯網公司面試官對一個高級/資深的候選人必須考察的。
由於若是一我的工做5年以上,來應聘高級職位的話,那咱們絕對是要求他對至少一個技術領域有着較爲深刻的研究的。
好比提及碼你得深刻閱讀過某個熱門技術的核心源碼,有必定的技術功底,能夠解決一些複雜的線上故障。
技術廣度決定了你能夠利用各類技術來作項目,可是技術深度決定了你的技術功底。
你將來學新東西有多快,線上系統出了故障你可否快速定位和解決,你可否基於對技術的深入理解爲公司的項目設計和開發出複雜並且優秀的架構出來,這都取決於技術深度。
6、總結 & 預告
小結一下,本文咱們用一個面試連環炮,引出了平時中大型互聯網公司面試官是如何發問的。
而後從技術廣度、底層技術、技術深度幾個角度說了一下,咱們通常如何考察候選人的技術。
免費Java資料領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring
Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分佈式、大數據、機器學習等技術。
傳送門: https://mp.weixin.qq.com/s/Jz...