拼多多PDD-4.24服務端研發(fā)實習生一面面經(jīng)
??面試公司:拼多多
??面試崗位:服務端研發(fā)實習生
??面試過程:全程問八股,沒聊項目,最后做道題。
- 自我介紹
- CMS和G1垃圾回收器,為什么現(xiàn)在生產(chǎn)環(huán)境主要用G1而不用CMS了?我沒答到點上,面試官希望我回答的是CMS的Full GC會導致STW(stop the world)的時間很長,以及時間很長的原因
- synchronized鎖升級的流程,說一下什么時候會發(fā)生鎖升級?我三階段答上來了,但是升級的觸發(fā)時機有點忘了
- 有沒有了解過HTTPS,講一下會話密鑰是如何決策出來的,講一下流程。如果有個中間人偽造了一個公鑰下發(fā)給客戶端,導致中間人將客戶端和服務器之間的信息被截獲了,如何防止這個攻擊?我背八股時有看到過,但印象不深,只回想起CA啥的,沒答上來。
- 有了解過消息隊列嗎?有聽說過Kafka嗎?這個我簡歷上只有RabbitMQ,不了解Kafka,和面試官說后他就換了個問題
- RabbitMQ底層是用什么語言實現(xiàn)的?答:Erlang。為什么Erlang實現(xiàn)RabbitMQ延遲會比較低?這個問題面試官覺得可能有點難就跳過了
- 講講RabbitMQ的優(yōu)先級隊列、延遲隊列是用來干嘛的嗎?舉兩個實際場景。面試官說如果他們要用RabbitMQ的話,是因為有這些RabbitMQ特有的feature,Kafka沒有,所以才會去用RabbitMQ,不然還是會用吞吐量更高的Kafka。
- MySQL存儲引擎InnoDB,它會有一個內(nèi)存的BufferPool,為什么要有這個區(qū)域?答的緩存減少磁盤IO
- 你知道一般的緩存命中率會有多少嗎?什么情況下BufferPool需要擴大?不太了解生產(chǎn)環(huán)境,猜測是查詢結(jié)果集較大時需要擴大。
- MySQL的分庫分表有了解過嗎?如果有個訂單表,數(shù)據(jù)量有1億條,你怎么去拆?答的水平分表,一開始我想的是按順序分表,但是如果不斷有新訂單產(chǎn)生的話,這個策略還合適嗎?后來我就改成了hash去分。
- 現(xiàn)在表已經(jīng)改完了,那么我需要怎么修改業(yè)務代碼去適配?你知道代碼為什么要改造嗎?如何盡可能減少代碼侵入去修改?面試官希望我回答的是通過Spring的AOP動態(tài)代理去做,但我當時只想到了代理,沒處理過這種業(yè)務,所以答得不好。
- MySQL的事務隔離等級有哪些?可重復讀會不會出現(xiàn)幻讀?我回答的是MySQL在一定程度上解決了幻讀,但還是存在幻讀現(xiàn)象,比如前面用快照讀,后面用當前讀,這種情況可能會出現(xiàn)。如果統(tǒng)一用快照讀(MVCC)或者當前讀(間隙鎖)的話可以避免。
- MVCC是存在哪里的?面試官希望我回答的是undo log,但我沒get到。
- bin log和redo log有什么區(qū)別?為什么需要redo log?為什么不直接刷到磁盤?這一塊的八股有點忘了,應該回答“順序?qū)憽焙汀半S機寫”的。為什么順序?qū)懕入S機寫快?面試官希望我回答磁盤的工作原理。
- 拋開價格因素不談,固態(tài)硬盤和機械硬盤分別會用在什么場景?兩者分別有什么好處和弊端?沒答上來,面試官說固態(tài)速度快但不容易恢復,所以他們的數(shù)據(jù)倉庫一般會用機械硬盤存,會比較好恢復,當然價格上機械硬盤也會比固態(tài)低很多。
- 代碼題:題干有點長,概括講就是有一個log文件里存了多條命令,命令分為四種,input、delete、undo、redo,input命令輸入,delete命令刪除、undo命令撤銷上個操作、redo命令重做上個被撤銷的操作,最終給出執(zhí)行完所有命令后的結(jié)果。面試官先讓我看題想思路,然后用偽代碼寫一下就行。思路就是用了兩個棧,一個記錄最終需要執(zhí)行的操作opStack,另一個記錄被撤銷的命令undoStack。在遇到input、delete命令時,將命令壓入opStack中;遇到undo命令時,把opStack棧頂?shù)拿顝棾?,壓入undoStack中;遇到redo命令時,把undoStack棧頂?shù)拿顝棾觯瑝喝雘pStack中。在讀完所有命令后,去執(zhí)行opStack里的命令就行。雖然中間因為個人對題意有點誤解,寫了一個比較復雜的版本,但后面在面試官的提示下還是寫出來了這個最終版本。
- 最后反問環(huán)節(jié)問了一下如果去拼多多實習的話,會做什么工作。面試官說一般入職后會有個新手項目,一邊做這個新手項目,一邊看各種文檔,主要是學習,不會參與業(yè)務代碼開發(fā)。新手項目是用來熟悉公司內(nèi)部的各個中間件的,后面會做一些影響不大的業(yè)務需求,了解業(yè)務流程,這時的需求還只是一些影響不大的小優(yōu)化或者之前擱置的非核心需求。大概兩個月后可以參與一些正式的業(yè)務需求了,這時因為要著急上線,而且涉及多個團隊進度,強度就上來了,一開始可能就參與一個需求,后面如果適應了就會加大需求的并發(fā)量,總體是這個節(jié)奏。
??面試體驗:今天早上面了榮耀,面試官似乎是做安卓開發(fā)的,所以問的都算比較基礎(chǔ),手撕也是最基礎(chǔ)的鏈表反轉(zhuǎn),20分鐘就結(jié)束了,如果去的話大概率需要換方向。晚上面拼多多,雖然對難度早就有心理預期,不過確實難度大了不少,有些問題挺底層的。面試官人挺好的,對于每個沒答上來的問題都會解答,只不過我答得確實太差了,估計大概率是要涼了。因為投得比較晚,所以這是我面的第二場,只能說還需要繼續(xù)沉淀,再多背幾家八股準備充分一點,到時候再多海投幾家吧,先攢個實習經(jīng)歷再說。