題目與背景
一個頁面經過瀏覽器、CDN 與源站反向代理三層快取。使用者回報偶發慢請求,你需要用標準化回應標頭定位哪一層未命中、是否發生條件驗證或請求合併。請基於 RFC 9211 設計觀測方案,並處理生產環境的隱私與快取投毒風險。
面試官考察什麼
重點是理解 Cache-Status 是結構化欄位列表,每個成員代表處理過請求的一層快取;靠近源站的成員在前,靠近使用者的成員在後。答案應區分 hit 與 fwd、解釋 fwd 原因和 ttl 新鮮度,並說明除錯資訊的授權與脫敏。
先問清楚的澄清問題
快取拓撲與責任
確認瀏覽器是否會追加欄位、各層是否允許保留上游值,以及哪些團隊能修改 CDN 和反向代理設定。沒有拓撲順序就無法正確解讀列表。
除錯採樣與資料敏感性
確認是否只對內部請求啟用、採樣率和日誌保留時間。快取鍵、租戶識別與個人化回應可能包含敏感資訊,不能預設回傳給所有客戶端。
新鮮度與一致性目標
確認資源的 Cache-Control、驗證器、允許的過期窗口和業務容忍度。ttl 為負只表示該層判斷回應已過期,不等於一定回傳了過期內容。
30 秒回答框架
「我讓每層快取追加自己的 Cache-Status 成員並保留已有列表,按從源站到使用者的順序讀取。hit 表示無需前往下一跳,fwd 則攜帶 uri-miss、vary-miss、stale 等原因;fwd-status=304 能識別條件驗證。只有內部除錯請求返回 detail 或 key,生產預設脫敏並限制授權,避免暴露租戶資訊和快取投毒線索。」
深入解答步驟
第一步:定義結構化欄位解析
把 Cache-Status 當作 RFC 8941 列表解析,每個成員讀取快取識別與參數。不要用字串包含判斷,因為成員可能有引號、參數順序變化和多層重複欄位。
第二步:建立追加與順序規則
每層在回應已有欄位時追加自己的成員,不能覆蓋上游值。靠近源站的快取先寫入,靠近使用者的快取後追加;缺少某層欄位時記錄拓撲缺口,而不是猜測命中層。
第三步:解釋命中和回源
hit 表示該層直接用儲存回應滿足請求;fwd=uri-miss 表示沒有匹配 URI,vary-miss 表示 Vary 選擇失敗,stale 表示找到的回應已過期。fwd-status 僅在回源時有意義,可區分 304 驗證和普通回應。
第四步:關聯 TTL、儲存與合併
ttl 是該層計算的剩餘新鮮時間,負值代表過期;stored 表示回源結果是否被保存;collapsed 表示多個請求是否合併到一次回源。將欄位與請求 ID、源站耗時和狀態碼關聯,才能定位尾延遲。
第五步:處理個人化和快取鍵
對帶認證、租戶或 Cookie 的回應先確認 RFC 9111 的可快取條件。生產回應只暴露快取識別、命中類型和粗粒度 TTL;key 與 detail 僅在受控除錯通道中返回,並移除使用者輸入片段。
第六步:設計安全的採樣策略
透過內部請求標頭、短時授權令牌或邊緣設定開啟除錯,預設關閉對公網的詳細資訊。日誌中對 Cache-Status 做結構化解析和存取控制,防止攻擊者利用命中狀態做時序推斷或發現快取鍵。
第七步:驗證端到端行為
構造 URI miss、Vary miss、過期驗證、請求合併和多層命中場景,檢查列表順序、fwd-status、TTL 符號和是否保留上游成員。對比真實回應、快取日誌和源站 trace,確認觀測欄位不改變快取語義。
高品質示例回答
我會讓瀏覽器、CDN 和反向代理按層追加 Cache-Status,並用結構化欄位解析器讀取列表。先按順序判斷每層是 hit 還是 fwd,再用 fwd 原因、fwd-status、ttl、stored 和 collapsed 解釋慢請求。內部除錯才返回 key 或 detail,公網回應只保留脫敏狀態;透過 URI miss、Vary miss、過期 304、請求合併和多層命中測試順序與安全邊界。
常見錯誤
- 錯誤: 把最後一個成員當作唯一快取結果。→ 原因: 列表記錄整條快取鏈。→ 改進: 按源站到使用者順序逐層解釋。
- 錯誤: 看到
hit就認為回應一定新鮮。→ 原因: 過期回應也可能被本地策略直接使用。→ 改進: 結合ttl與 Cache-Control 判斷。 - 錯誤: 覆蓋上游 Cache-Status。→ 原因: 丟失前層證據。→ 改進: 保留列表並追加本層成員。
- 錯誤: 對公網返回
key和 detail。→ 原因: 可能暴露租戶、時序或投毒線索。→ 改進: 僅授權除錯通道返回並脫敏。
追問與回答
追問 1:hit 與 304 驗證有什麼關係?
無需回源的重用是 hit。若快取必須向下一跳驗證,應使用 fwd,並可用 fwd-status=304 表示下一跳確認了已有表示。
追問 2:多個 Cache-Status 欄位行能否直接拼接?
HTTP 欄位組合規則允許把同名欄位視為一個列表,但實作應使用 RFC 8941 解析器處理逗號、引號和參數,不能依賴簡單字串拼接。
追問 3:負 TTL 是否證明使用者收到過期內容?
不證明。負 TTL 表示該層計算出的回應已過期,後續可能回源驗證,也可能在明確允許的過期策略下服務;必須結合 fwd 和回應策略判斷。
追問 4:如何定位只有部分使用者慢?
比較不同節點的 Cache-Status 成員、Vary 選擇、TTL 和 collapsed 比例,並關聯地理、Cookie 和請求標頭差異。若只在某層出現 vary-miss,應檢查該層的鍵構造和設定漂移。