🎙️ 第一輪:基礎構建與系統設計(3問)
面試官:我們先從一個實際業務場景開始。假設你現在要設計一個“雙十一秒殺系統”,用户搶購限量商品,你會怎麼選型技術棧?為什麼?
謝飛機:啊這……我肯定用 Spring Boot 啊!啓動快,配置少,還能打成 jar 包直接跑!數據庫嘛,MySQL 啊,我增刪改查賊6!
面試官:嗯……那你考慮過高併發下 MySQL 的瓶頸嗎?比如 10 萬用户同時點“立即購買”?
謝飛機:那我就多開幾個 MySQL 實例唄,主從複製,讀寫分離!我還知道分庫分表呢,sharding-jdbc 我背過面試題!
面試官:很好,有基本概念。但你有沒有想過,真正壓垮系統的往往不是數據庫,而是瞬間流量?
謝飛機:哦——那我加個 Nginx 做負載均衡!再上個 Redis 緩存熱門商品信息,這樣就不打數據庫了!
面試官:✅ 回答不錯!Redis 確實是第一步優化的關鍵。緩存熱點數據、預減庫存,都是常見手段。
🎙️ 第二輪:核心中間件與併發控制(4問)
面試官:好,那我繼續問。如果商品庫存只有 100 件,但 10 萬人搶,你怎麼保證不超賣?
謝飛機:簡單啊!我用 MySQL 的 UPDATE product SET stock = stock - 1 WHERE id = 1 AND stock > 0,靠數據庫行鎖不就行了?
面試官:如果請求量太大,數據庫扛不住怎麼辦?
謝飛機:那……那我就在代碼里加個 synchronized?
面試官:集羣環境下,synchronized 還管用嗎?
謝飛機:呃……好像只能鎖住當前 JVM?那我用 Redis 的 SETNX 實現分佈式鎖!key 是商品ID,value 是線程ID,釋放時判斷一下……
面試官:⚠️ 思路方向正確,但 SETNX 有原子性問題,而且沒設置過期時間會死鎖。建議用 Redisson 或 Lua 腳本實現可重入、帶過期的分佈式鎖。
面試官:再問,如果大量請求涌進來,系統快崩了,你怎麼處理?
謝飛機:我……我讓用户排隊?或者彈個“網絡繁忙,請稍後再試”?
面試官:這叫降級。更優雅的方式是結合 Sentinel 做限流,用滑動窗口或令牌桶算法控制 QPS。
🎙️ 第三輪:異步解耦與系統穩定性(5問)
面試官:現在你用了 Redis 鎖 + 數據庫扣減,但還是怕數據庫被打掛。有沒有更好的方案?
謝飛機:我……我可以先把訂單寫到日誌裏?等高峯過了再慢慢處理?
面試官:有點意思,你説的是“異步化”。具體用什麼中間件?
謝飛機:Kafka!我知道 Kafka 牛,高吞吐,削峯填谷!我把搶購請求發到 Kafka,後面用消費者慢慢消費,扣庫存、發短信、推通知!
面試官:✅ 正確!這就是典型的“消息隊列削峯”。但 Kafka 消費失敗了怎麼辦?
謝飛機:我……我讓它重試?100 次!
面試官:無限重試會導致消息堆積甚至雪崩。應該結合死信隊列(DLQ)+ 人工干預機制。
面試官:最後一個問題:如何監控整個鏈路性能?比如用户點擊到訂單生成耗時多久?
謝飛機:我……我看日誌?grep 一下 traceId?
面試官:可以,但效率低。你應該用 Zipkin + Sleuth 做分佈式鏈路追蹤,配合 Prometheus + Grafana 監控 Kafka 消費延遲、Redis 命中率等指標。
✅ 面試總結
面試官:今天的問題就到這裏。整體來看,你對主流技術有了解,但在高併發設計、容錯機制和監控體系上還需要加強。不過思路清晰,學習意願強,我們會盡快給你反饋,回去等通知吧。
謝飛機:(小聲嘀咕)等通知=沒戲……但我學到了 Redis 鎖不能只用 SETNX,還得設過期時間,最好用 Redisson……
💡 真題解析:電商秒殺系統的完整技術方案
🌐 業務場景:電商秒殺系統
- 用户在指定時間搶購限量商品
- 瞬時併發可達數萬甚至十萬級
- 核心目標:防超賣、高可用、低延遲、可追溯
🔧 技術架構圖(簡化版)
用户請求 → Nginx → API Gateway (Sentinel 限流)
↓
Spring Boot 服務集羣
↓
Redis(緩存熱點 + 分佈式鎖)
↓
Kafka(異步削峯)
↓
消費者服務 → MySQL(最終落庫)
↓
Elasticsearch / Prometheus
🧩 關鍵技術點詳解
1. Redis 防超賣 & 分佈式鎖
- 使用
Lua腳本保證原子性:先檢查庫存,再扣減,避免GET + DECR的併發問題 - 分佈式鎖推薦使用 Redisson,支持可重入、看門狗自動續期、公平鎖等特性
- 示例 Lua 腳本:
if redis.call('get', KEYS[1]) >= 1 then
return redis.call('decr', KEYS[1]);
else
return -1;
end
2. Kafka 削峯填谷
- 秒殺成功後,將訂單信息發送至 Kafka Topic
- 後台消費者服務異步處理:寫數據庫、發郵件、推消息
- 優勢:解耦、提高響應速度、防止數據庫瞬時壓力過大
3. 限流與降級(Sentinel)
- 設置 QPS 限制,如單機 1000 請求/秒
- 超過後返回“活動太火爆,請稍後再試”
- 結合熔斷機制,當數據庫異常時自動降級為“僅查看”模式
4. 鏈路追蹤(Sleuth + Zipkin)
- 每個請求生成唯一
traceId,貫穿上下游服務 - 可定位性能瓶頸,如 Kafka 消費延遲、Redis 超時等
5. 監控體系(Prometheus + Grafana)
- 監控指標包括:
- Redis 命中率、連接數
- Kafka Topic 積壓消息數
- JVM 內存、GC 頻率
- 接口平均耗時、錯誤率
📚 學習建議
|
技術點
|
推薦學習路徑
|
|
Redis 分佈式鎖
|
學習 Redisson 源碼,掌握 Lua 腳本原子操作
|
|
Kafka 削峯
|
動手搭建生產者消費者,模擬高併發場景
|
|
Sentinel 限流
|
閲讀官方文檔,配置規則持久化
|
|
Sleuth 鏈路追蹤
|
Spring Cloud Sleuth + Zipkin 快速集成
|