前言
面試的時候被考到一題情境題覺得蠻有趣的,於是決定記錄下來。
面試過程
面試官:今天有一個網站是 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 部分,但是在面試官的引導下還算是過關了。
知識總結
- 網頁 load 不出來 - 需要知道前端掛掉時怎麼找到前端的 log 跟 request 現在的狀態。
- 後端沒有 response - 這就代表了不是前端的問題,主要是卡在後端的 controller 那層。
- 後端的 code 只有跟 db 撈資料 - 需要知道 db 出狀況有哪些方式可以找到 db 的 log 或是該怎麼檢查 db 的狀態。
- db 連不進去 - 需要知道造成 db 連不進去有可能的原因有哪些。
- 優化整個服務的效能 - 需要先抓到整個服務的效能瓶頸在哪,然後針對這個環節有哪些優化的手段,還有手上有哪些資源可以使用(人/錢)。