問題與範圍
討論單一請求延遲分布、並發請求組合效應和服務級目標。預設 API 每分鐘處理 10 萬次請求,平均 80 毫秒,p95 為 180 毫秒,p99 為 2 秒。數字是面試假設,不是行業基準。
面試官在考察什麼
面試官想看你是否理解平均值只描述總量,不描述分布形狀。尾部請求可能集中在某租戶、路由、依賴、區域、請求大小或重試路徑。好的回答會區分量測窗口、聚合維度、客戶體驗和服務端原因,並把指標連到可執行 SLO。
回答前要釐清的問題
- 延遲是從客戶端發出到收到首位元組,還是到完整回應?
- p99 按單一實例、路由、區域還是全服務計算?窗口多長?
- 是否包含逾時、取消、重試和快取命中?
- 請求大小、租戶、依賴呼叫和錯誤率是否隨尾部變化?
- 目標是降低所有請求,還是保證關鍵路徑尾部預算?
30 秒回答框架
「平均 80 毫秒不表示所有請求都接近 80 毫秒;p99 為 2 秒說明最慢 1% 仍會顯著影響使用者和上游逾時。先固定量測定義和窗口,按路由、區域、實例、租戶、請求大小和依賴分解分布。再查看佇列、連線池、GC、磁碟、鎖、下游和重試。改善要針對瓶頸:有界佇列、合理逾時、批量或快取、減少串行依賴、隔離噪音租戶,並以 p95/p99 SLO 和錯誤預算驗證。」
分步深入設計
先定義觀測點:客戶端總耗時、邊緣到服務、服務處理、下游等待和回應傳輸。明確使用首位元組或完整回應,統一單調時鐘和採樣規則。超時與取消分開計數;重試請求與原始請求關聯,避免一次使用者操作算成多個獨立成功。
百分位必須基於請求樣本分布,不能先對實例 p99 求平均。按路由、狀態碼、區域、實例、租戶、請求大小和依賴繪製分位數與樣本量。窗口太小會抖動,太大又會掩蓋發佈回歸;同時展示短窗口告警和長窗口 SLO。
組合請求會放大尾部。頁面串行呼叫多個服務時,總延遲接近各階段之和;並行呼叫時,只要一個子請求慢,整體延遲就接近最大值。為各階段分配預算,記錄 trace span,並識別扇出數量。
定位時先看相關性:佇列年齡上升表示排隊或容量問題;連線池等待表示並發邊界;GC、磁碟和 CPU 抖動可能形成長尾;單一下游 p99 變差會傳導到上游。比較成功與逾時樣本屬性,並用受控採樣保留慢請求上下文。
改善措施要匹配原因。減少串行依賴、使用快取或批量可降低固定開銷;有界並發、背壓和租戶隔離可阻止擁塞擴散;合理逾時和有限重試避免重試風暴;非同步化可把不可控工作移出同步路徑。尾延遲改善不能靠無限加執行緒。
SLO 用「合格請求占比」表達體驗,例如 99.9% 有效請求在 300 毫秒內完成。錯誤預算把延遲違約與錯誤放在同一決策框架。SLO 必須標明入口、狀態碼、快取語意和窗口;只對平均值設目標會掩蓋最慢使用者。
發佈和故障演練要驗證分布變化。比較版本前後 p50、p95、p99、最大值、逾時率和樣本量;向依賴注入延遲,觀察尾部是否按預期擴大;製造大請求和連線池耗盡,確認隔離與降級生效。恢復後檢查佇列排空速度和重試放大。
高品質示範回答
「80 毫秒平均值與 2 秒 p99 同時成立,說明分布有明顯長尾,最慢 1% 可能觸發使用者逾時或上游級聯。先統一計時邊界,區分首位元組、完整回應、取消和重試,再按路由、區域、實例、租戶、請求大小和依賴分解。端到端頁面還要考慮串行求和和並行取最大值,因此用 trace span 給每段分配預算。
定位到佇列、連線池、GC、磁碟或下游後,分別採用有界並發、快取/批量、減少串行依賴、租戶隔離和有限重試。最後用 99.9% 請求在 300 毫秒內完成的 SLO、錯誤預算和版本分位數比較驗證。」
常見錯誤
- 只報告平均值 → 長尾使用者被隱藏 → 同時報告分位數、樣本量和逾時率。
- 平均各實例 p99 → 百分位不可線性平均 → 合併原始樣本或正確聚合直方圖。
- 把重試當新使用者請求 → 體驗與負載被誤計 → 關聯原始請求和嘗試。
- 只看服務端時間 → 網路、排隊和傳輸被遺漏 → 定義完整端到端邊界。
- 無限增加執行緒 → 競爭和排隊讓尾部更長 → 設定有界並發和背壓。
- 盲目重試逾時 → 重試風暴壓垮依賴 → 預算、抖動和截止時間。
- 只對整體設 SLO → 某租戶或區域長期退化 → 按關鍵維度切分。
追問與回答
追問一:為什麼 p99 不是最慢請求?
p99 表示約 99% 樣本不超過該值,剩餘約 1% 更慢;最大值對單一異常和樣本量敏感。兩者用途不同。
追問二:頁面有五個並行請求,如何估算體驗?
並行階段完成時間接近五個請求的最大值,還要加客戶端調度和傳輸。應量測頁面總耗時並用 trace 找出最慢請求。
追問三:何時應接受更高尾延遲?
離線匯出或低頻背景工作可能用吞吐換延遲;互動式關鍵路徑通常不能。不同請求類要有自己的 SLO。
追問四:直方圖為什麼比平均值有用?
直方圖保留分桶和分布形狀,可估算多個百分位並觀察長尾;聚合仍要注意分桶和樣本量。
追問五:如何區分排隊長尾和下游長尾?
分開記錄等待、處理和下游 span。佇列與服務時間一起升高偏向容量問題;只有下游變慢則檢查依賴和重試。
追問六:錯誤預算如何幫助延遲治理?
把超過延遲閾值的請求計入預算消耗。預算快速耗盡時暫停高風險發佈、優先修復尾部;預算充足時做受控實驗。