具代表性的面試主題

系統設計面試:設計有韌性的首屏聚合 API

系統設計困難
Offer.cc 編輯團隊發佈 更新

題幹

用戶端首屏需要使用者資料、權限和個人化資訊流。請在每秒 2000 次請求、p95 預算 300 毫秒下設計 bootstrap API,涵蓋部分回應、依賴故障、重試和可觀測性。

題目與適用場景

bootstrap 端點編排三個下游呼叫。資料和權限是正確渲染外殼所必需,資訊流可以陳舊或缺失。端點必須返回具型別的回應,讓用戶端分別渲染安全區塊。p95 預算 300 毫秒包含編排開銷,並要說明哪些資料可以快取、快取多久。

面試官考察點

  • 從使用者需求推導並行度、逾時預算和失敗語意。
  • 區分缺失資料、空結果和依賴錯誤。
  • 組合重試、熔斷、艙壁和快取策略,避免放大負載。
  • 設計可演進回應協定與有用的運行訊號。

回答前需要釐清的問題

確認權限是否允許陳舊、資訊流的新鮮度上限、用戶端是否支援漸進渲染,以及呼叫是否共享租戶與授權上下文。權限不能陳舊時必須留在關鍵路徑;資訊流若允許五分鐘陳舊,可以用 stale-while-revalidate 快取保護延遲。

30 秒回答框架

閘道先完成一次驗證,並行呼叫資料、權限和資訊流,然後為組裝預留截止時間。必要區塊失敗時拒絕或返回安全狀態;可選區塊返回帶原因碼和資料時間的明確不可用狀態。重試只用於瞬時且冪等的讀取,並消耗共享預算。每個依賴設定逾時、艙壁、熔斷和陳舊快取,避免一次故障讓外殼空白。指標記錄區塊成功率、截止時間耗盡、陳舊回應和依賴飽和。

分步深入解答

1. 設定時間和並發預算

每秒 2000 次請求下,三個串行呼叫會耗盡 300 毫秒預算。並行呼叫,為每個依賴設定低於總截止時間的局部截止時間,並在剩餘時間內完成組裝與序列化。限制連線池,使用每請求取消訊號,讓逾時依賴停止繼續消耗資源。

2. 定義部分回應語意

返回穩定外殼,為每個區塊標記 readystaleunavailable,並附機器可讀原因和資料時間,但不洩露內部主機名稱。資料或權限錯誤應拒絕或返回登入/操作狀態;資訊流逾時可以保留可用外殼。遵循 RFC 9457 的錯誤物件可以描述請求級錯誤,同時不假裝所有區塊都失敗。

3. 保護依賴免受重試和故障影響

只重試瞬時錯誤、冪等讀取,而且只能在共享截止時間內重試一次。加入抖動,熔斷打開後停止重試。每個依賴的艙壁限制並發;陳舊快取或有界預設值處理可選資訊流。熔斷器能防止反覆故障耗盡閘道容量,但不能替代逾時和恢復探測。

4. 演進並觀測協定

以追加欄位方式版本化,讓用戶端忽略未知區塊,並攜帶請求關聯識別碼。記錄依賴延遲、逾時原因、熔斷狀態、快取年齡、區塊狀態和回應大小。為扇出樹建立追蹤,抽樣慢請求,並監控必要區塊失敗率、陳舊時間和重試量。協定測試涵蓋權限就緒、資料陳舊、資訊流不可用等混合結果。

高品質示範回答

我會先確認新鮮度和是否允許漸進渲染。閘道完成一次驗證,呼叫三個讀取服務,並在總預算 300 毫秒內分配局部截止時間。回應按區塊返回 readystaleunavailable。身分和權限失敗時拒絕,資訊流可使用有界陳舊快取。瞬時冪等讀取只允許一次帶抖動的重試,並由依賴艙壁和熔斷保護。指標和追蹤暴露區塊失敗與截止時間壓力,追加欄位保證舊用戶端繼續工作。

常見錯誤

  • 串行呼叫依賴 → 延遲相加超過預算 → 有界並行並設定截止時間。
  • 用含糊的 null 返回 HTTP 200 → 用戶端無法區分空資料和失敗 → 使用明確區塊狀態和原因碼。
  • 每層都重試所有錯誤 → 故障變成重試風暴 → 分類錯誤並執行共享重試預算。
  • 沒有策略就快取權限 → 授權可能過期仍被使用 → 定義新鮮度上限或失敗關閉。
  • 使用一個全域熔斷器 → 資訊流故障阻塞身分資料 → 按依賴隔離熔斷和艙壁。
  • 只記錄總延遲 → 無法區分可選與必要失敗 → 輸出區塊指標和追蹤。

追問及應對

資訊流很慢,但使用者要立即看到外殼,怎麼辦?

縮短資訊流截止時間,在允許的年齡內返回有界陳舊結果,否則返回 unavailable。外殼保持獨立,用戶端之後再載入資訊流。

某區域權限資料陳舊,可以返回嗎?

只有授權策略明確允許該陳舊程度,且回應傳達資料年齡時才可以。敏感操作應重新向權威來源檢查,不確定時失敗關閉。

如何防止重試延長到 300 毫秒之後?

透過扇出上下文傳遞一個絕對截止時間。每次重試前預留嘗試與組裝時間;沒有剩餘時間就返回區塊逾時狀態,不啟動注定無法完成的工作。

熔斷打開後依賴恢復,如何恢復流量?

冷卻後傳送少量半開探測。只有探測滿足相同逾時和錯誤標準才關閉熔斷,否則保持打開並暴露下次探測時間。

公開來源

同類題目

相關面試工具

用 Solve 整理系統設計回答

從澄清需求開始,展開規模、架構、元件選擇和取捨。

查看工具