面試 debug 情境題

前言

面試的時候被考到一題情境題覺得蠻有趣的,於是決定記錄下來


面試過程

面試官:今天有一個網站是 3-tier 的架構(前端、後端、資料庫),某天你發現首頁 load 不出來,這時候你會怎麼做?

我:打開瀏覽器的 console 看 network 那邊的 request 狀態是怎樣

面試官:你打開了,看到 request 沒有回傳 response,就卡著

我:這樣看起來是後端掛了,先檢查後端的 log

面試官:後端沒有 log,但是這個 controller 只有跟 db 撈資料,其他都沒有做

我:那應該是後端跟 db 溝通的時候卡住了,這張表很大嗎?

面試官:大概 10 萬筆

我:那應該還好,db 那台的 memory 跟 CPU 都是健康的嗎?

面試官:CPU 跟 memory 的 usage 都不超過 30%

我:db 是 RDS 嗎?

面試官:是

我:RDS 可以看每條 query 跑的狀況,這條 query 跑的狀況有異常嗎?

面試官:前幾次跑都沒問題,但是這次掛了

我:…

面試官:那現在是什麼問題?你需要一點提示嗎?

我:好,我要提示

面試官:你手動連接 db 發現連不進去了

我:那應該是 connection pool 沒設定好,需要檢查一下 connection pool 的設定

面試官:好,那今天你把 connection pool 調小一點,然後 bug 解掉了,但是過幾個月後流量暴增,現在服務又卡住了,你要怎麼優化?

我:SQL 是讀寫都有,還是只有讀而已?

面試官:只有讀

我:對 db 做 replica

面試官:OK,這樣問題解掉了,但是你的解法很浪費資源,因為效能瓶頸是卡在 db,不是後端流量被灌爆,但是你為了 replica,後端也要新開一台出來,但是大部分時間後端的利用率是很低的,你還有其他方法嗎?

我:有錢嗎?

面試官:老闆說,錢管夠

我:機器多開幾台

面試官:這是一個方法沒錯,還有其他的方法嗎?

我:優化 SQL 的寫法,然後加上 cache

面試官:你的 cache 打算怎麼做?

我:在後端做 cache

面試官:cache 的 key 是什麼

我:我應該會用頁面當作 key

面試官:OK 看起來應該差不多了


感想

這是一次蠻新鮮的面試經驗,以前從沒被這樣考過,但是我還挺喜歡這種考法的,很貼近現實,而且考得層面很廣,考完一次大概就可以知道你大概懂哪些東西,哪邊地方比較弱,雖然這次考得算是我比較弱的 db 部分,但是在面試官的引導下還算是過關了

以下是我把對話中的問題整理過,然後需要哪些方面的知識

  1. 網頁 load 不出來 -> 需要知道前端掛掉時怎麼找到前端的 log 跟 request 現在的狀態
  2. 後端沒有 response -> 這就代表了不是前端的問題,主要是卡在後端的 controller 那層
  3. 後端的 code 只有跟 db 撈資料 -> 需要知道 db 出狀況有哪些方式可以找到 db 的 log 或是該怎麼檢查 db 的狀態
  4. db 連不進去 -> 需要知道造成 db 連不進去有可能的原因有哪些
  5. 優化整個服務的效能 -> 需要先抓到整個服務的效能瓶頸在哪,然後針對這個環節有哪些優化的手段,還有手上有哪些資源可以使用(人/錢)