天天看點

面試系列:蘑菇街面經

序言

說起來也是一段難忘的經曆,就在不久前參加了蘑菇街的秋招,最終倒在了2面。。。

自己也收獲了許多最終決定将這次經曆分享給大家,在這兒求個贊!(#.#)

投遞履歷

履歷真的是非常重要的,它就相當于我們的敲門磚,首先自己得有足夠的項目經驗,再者找一個好模闆也非常重要。我在寫履歷的時候也參考了很多github上的履歷。

https://github.com/apachecn/Interview

(附上一個連結)

我是通過朋友内推的方式投遞到的蘑菇街,一個星期後收到了一面的邀請。。。

一面

當時正在教室上課,面試官突然說第二天有事,要提前一天面試,于是我趕忙找了個空閑的辦公室,蘑菇街面試的方式是通過QQ視屏面試的,這也是我第一次視屏面試,體驗還不錯,看到面試官後,緊張的心突然不緊張了。(可能是面試官長得比較親切吧)

第一個環節就是自我介紹了,這個環節要盡量精簡,不宜占用太長的時間,盡量說一些履歷上沒有的内容。

  • 面試官:說一下SpringBoot和Spring的差別:
  • 我:SpringBoot其實是讓我們更友善使用Spring的架構,然後說了下SpringBoot自動配置的原理和起步依賴
  • 面試官:說一下SpringCloud的常用元件
  • 我:主要說了一下常用的5大元件(注冊中心,配置中心,網關,負載均衡遠端調用,熔斷器),還有Alibaba開源的一些元件。

    然後面試官又問了一些注冊中心的實作原理和常見的負載均衡算法,主要問了一下權重負載的實作

    (可以看出分布式架構的重要性!上來就直接怼了目前主流的SpringBoot和SpringCloud)

  • 面試官:說一下Mybatis的執行流程和底層實作
  • 我:這個回答的還算可以,因為之前有自己寫過一個簡易的Mybatis

    (面試底層真的很重要,光會用還不行,平時沒事得多看看源碼)

接下來就是直接怼項目了,我自己做過4、5個項目,由于蘑菇街是個電商公司,是以我就選擇了一個電商項目。

Redis在項目中的使用

  • 面試官:說一下項目如何承載高并發通路
  • 我:nginx負載均衡+用redis做緩存+異步的處理方式
  • 面試官:說一下redis在項目中的使用
  • 我:主要做一些熱點key的緩存,購物車的緩存還有JWT令牌的存放
  • 面試官:說一下redis可能存在的問題
  • 我:說了一下redis緩存雪崩,穿透,擊穿的場景和對應的解決方案

    具體的解決方案可以看我的另一篇文章:深入淺出redis(我也是一個菜鳥,有寫錯的地方還請看客指出)

  • 面試官:說一下緩存一緻性的問題
  • 我:延時雙删政策(當時隻會這一種性能不高的政策。。。)
  • 面試官:說一下redis會不會丢失資料
  • 我:說了下RDB和AOF的持久化機制

秒殺子產品

  • 面試官:說一下秒殺的實作
  • 我:我說了一下在項目中秒殺的實作

商家填寫秒殺商品,管理者同意,定時腳本将秒殺商品的資訊存放到redis當中。

使用者秒殺商品,首先會對使用者的排隊次數做校驗,如果該使用者正在排隊秒殺該商品則直接傳回(不允許使用者重複秒殺同一商品,害怕一些人作弊!)

然後将使用者秒殺的資訊封裝起來,發送一條MQ消息,接收方接收後異步的進行處理(為了提高并發量)

接收方,接收到消息後主要做一些參數的校驗,然後生成預訂單,扣減庫存(這裡需要通過分布式鎖來防止出現超賣的情況),然後儲存訂單的資訊,修改使用者秒殺的狀态。

最後發送一條延時消息(RocketMQ自帶,RabbitMQ需要通過過期消息+死信隊列來實作),來判斷使用者的付款狀态,如果在指定時間内還沒有付款的話,就将訂單設為失效訂單,然後做一些資料的補償。

面試官問了一些優化方面的問題,也提出了一些可能會出現的問題

優化:

可以通過在nginx的openresty配置一段腳本,請求達到nginx後直接檢視庫存是否足夠,不足夠的話直接傳回。

提前對秒殺的URL進行編碼,防止被别人提前知道秒殺的位址,進而通過作弊的手段進行秒殺。

做一些限流的保護

多個系統之間的調用

  • 面試官:說一下多個系統之間的調用方式和可能會出現的問題

通過openFeign來進行遠端調用,然後做一些熔斷的保護防止雪崩的情況。

多個系統調用涉及到的分布式事務問題。

(解決方案在我另一篇文章:分布式事務的解決方案)

結束語

  • 面試官:你有什麼問題想要問我嗎?
  • 我:主要問了一些公司使用的架構(他們内部使用的是自研的架構),還偷偷問了下面試結果(這次面試自我感覺挺好的,就問了一下)面試官說讓我好好準備二面。

PS:一面愉快結束,總耗時50分鐘,面試完心情還是十分的激動。

二面

一面過了1天就收到了二面的邀請,不過二面的時間是定在了一個星期之後,時間點也很尴尬,正好是下午的2.30,這個時間點正是剛午休完,腦袋暈暈的。

經過漫長的等待,終于等到了二面那一天(一面的面試官是提前幾天加我QQ的,但二面的面試官是在2.29分才加的,當時心裡就感覺“來者不善”,應該是個“狠角色”)

撥通視訊,看到面試官的第一眼就感覺和一面的面試官感覺不一樣,二面的面試官看起來就是很嚴肅的,高高的發際線和一副黑框眼鏡!然後說了一下這次面試時間大概在30分鐘左右,是以當時心裡特别的緊張(最後經過了解這位面試官正是我要面試的部門的leader)

  • 面試官:上來直接就讓我講項目了
  • 我:介紹了一下項目(和一面介紹差不多)
  • 面試官:請講一下面試過程中遇到的最大困難
  • 我:一開始聽到這個問題有點蒙蔽,腦子裡不停想着自己當時碰到的坑,最後說了一下配置方面包掃描的問題,編碼方面說了一下雪崩的問題
  • 面試官:這個項目是在本地麼?還是已經部署了?
  • 我:這個問題直擊我的弱勢,因為之前我總認為部署是運維需要做的事,自己就沒有實踐的部署過項目,包括一些測試,也是本地用jmeter壓測的。(這個問題應該是減分最大的,也就直接導緻了我的二面失敗,結束面試後我就痛定思痛,改變了這一思想然後自己部署了一下)
  • 面試官:說一下限流的常見算法
  • 我:說了一下漏桶算法,令牌桶算法和滑動視窗算法。(大概是回答出來了,但有一些細節方面的問題沒有回答的很好)
  • 面試官:這個項目有什麼亮點?
  • 我:這個問題也讓我蒙蔽了,在思索過後就說了一下秒殺子產品。。。
  • 面試官:你有什麼問題想問我的嗎?
  • 我:我就讓面試官說了一下我的不足,面試官給我說了一下真正的開發不僅僅是編碼方面的開發,還包括後期的部署,維護等方面。

PS:二面持續了30分鐘左右,雖然時間不長但也讓我收獲了很多吧!

面試總結

通過這次面試可以看出,微服務相關的知識還是很重要的,并且需要對分布式常見的問題有一些解決的思路,

總體的知識廣度要求還是挺高的,深度方面也尤為重要,面試官一般會針對一個問題給你發出連環炮,直到你答不上來為止,是以平時在學習的過程中一定不能忽視細節方面,也需要多讀讀源碼,因為源碼這一塊必是面試加分項,多抽時間對自己所學的知識進行沉澱,把知識變成自己的,終有一天可以“吊打面試官”的哈哈哈。

最後祝願所有的讀者可以找到心儀的工作!