題幹與適用場景
設計一個影子流量系統,服務每秒接收 20,000 個請求。主要請求必須維持現有 p99 延遲,影子版本可以落後。系統需要按端點採樣,保留足夠證據重播差異,並保證鏡像請求不會送出付款、郵件或其他外部副作用。
核心是應用層請求鏡像,不是網路抓包。負載平衡器可以非同步送出一份 fire-and-forget 副本到鏡像後端,主要回應仍是唯一權威結果。網路流量鏡像有不同的目標和封裝,不能替代理解端點語意的重播路徑。
面試官考察點
面試官要的是安全的比較工具,而不是複製一套生產服務。強回答會保護主要路徑延遲、移除憑證、隔離寫入、讓採樣可重現,並解釋為什麼逐位元組比較通常不正確。
面試官會追問捕獲佇列滿、影子服務變慢、回應含時間戳,以及主要服務已經寫入外部系統時怎麼辦。每個情境都要有明確策略。
回答前需要澄清的問題
- 請求是否唯讀?唯讀請求可以直接重播;寫請求需要沙箱、stub 或合成身分。
- 比較是精確還是語意比較?確定性 JSON 可精確比較;時間戳和隨機 ID 應使用遮罩或不變量。
- 捕獲內容是否含個人資料?如果有,要在儲存前去識別化、加密引用、定義保留期和存取稽核。
- 目標是遷移正確性、延遲還是容量?目標不同,指標和採樣策略也不同。
30 秒回答框架
「我會在授權之後、外部寫入之前捕獲請求,清理金鑰和個人資料,再非同步放入可重現的採樣佇列。主要回應仍直接返回。隔離的影子 worker 使用獨立憑證、沙箱和有界速率重播。差異服務比較狀態碼、選定欄位、不變量和延遲,忽略聲明過的非確定性欄位。佇列溢出時丟棄鏡像而不拖慢使用者。發布前要有差異率、錯誤率、隱私和容量門檻,並確認沒有不安全副作用。」
分步驟深入解答
1. 不觸碰關鍵路徑地捕獲
把捕獲鉤子放在認證授權之後、不可逆外部呼叫之前。只複製影子需要的欄位,移除 Authorization、Cookie、使用者 token 和付款資訊,換成短期影子憑證或固定測試身分。
發布 MirroredRequest,包含請求 ID、trace ID、端點、去識別化請求頭、正文引用、捕獲時間、目標版本和採樣設定版本。入隊必須有上限時間;緩衝或持久佇列滿時記錄丟棄指標並返回主要回應。
2. 讓採樣可重現
對穩定的請求 ID 或 trace ID 做雜湊,與設定的採樣率比較,保證重試和調查時結果穩定。再按端點和租戶使用 token bucket 限制鏡像 RPS,採樣比例和 token 預算取較小值。
每次捕獲都保存採樣設定版本,報告才能區分真實差異和採樣規則變化。
3. 在隔離環境中重播
worker 從持久佇列讀取,用短逾時請求影子版本。影子必須使用獨立資料庫或交易 stub,付款和郵件供應商要替換成 fake,並關閉外呼回呼。唯讀請求通常使用唯讀副本或去識別化快照更安全。
捕獲佇列採用至少一次投遞沒有問題,因為重播帶請求 ID。worker 記錄 SHADOW_ERROR、DROPPED 或 COMPLETED;影子逾時不能無限重試,也不能阻塞主要請求。
4. 按語意比較回應
先比較狀態碼。成功 JSON 去掉明確聲明的非確定性欄位,再比較選定路徑或規範化後的 body hash。加入業務不變量,例如總額不能為負、返回的使用者必須屬於要求的租戶。延遲單獨比較,回應正確但太慢也不能發布。
保存兩側 hash、差異路徑、主要與影子延遲、部署版本和樣本請求引用。報告中不要保存敏感正文。
5. 定義發布門檻
重播前先定義差異率、影子錯誤率、延遲回歸、佇列年齡和去識別化失敗閾值。按端點、租戶層級、地區和回應類別切分;總差異率為綠不能掩蓋付款端點損壞。
使用滑動視窗和最小樣本量。1% 差異閾值只是示例政策,不是通用規則。發布還要滿足無不安全副作用、影子容量可承受,並審閱每個高嚴重度差異的樣本。
6. 運作與恢復
影子過載時暫停重播,不必關閉捕獲。按隱私政策過期樣本,稽核請求引用的存取。影子版本回滾後,報告仍要關聯部署版本,避免不同版本混在一起分析。
測試佇列丟失、重複捕獲、過期設定、憑證洩漏、副作用嘗試、非確定欄位、影子逾時和地區故障。成功標準是主要服務仍符合 SLO,影子輸出可操作、可重現的證據。
高品質示範回答
「我會在認證授權之後、外部寫入之前加入應用層鏡像鉤子。它移除真實憑證和敏感欄位,保存正文引用,並按 trace ID 可重現地採樣。主要路徑不等待鏡像,佇列有壓力時可以丟棄鏡像工作。
「隔離 worker 使用獨立身分、資料庫和 stub 供應商重播到影子版本。每次重播都帶請求 ID 和逾時。比較服務檢查狀態碼、選定 JSON 路徑、業務不變量和延遲,只忽略聲明過的非確定欄位。報告保留 hash、差異路徑、版本和去識別化樣本。
「發布前設定端點級差異、錯誤、延遲、佇列年齡和隱私門檻,要求足夠樣本並審閱嚴重差異。寫請求必須進入沙箱,無法隔離的端點直接排除並說明覆蓋缺口。最後驗證佇列溢出、重複、憑證清理、副作用和地區故障,同時證明主要 SLO 未受影響。」
常見錯誤
- 錯誤表現 → 失敗原因 → 修正方法: 重播生產憑證 → 影子呼叫可能洩漏或修改真實系統 → 清理金鑰,使用隔離身分、資料庫和供應商。
- 錯誤表現 → 失敗原因 → 修正方法: 等影子回應後再返回 → 遷移驗證增加使用者延遲 → 非同步入隊,壓力大時丟棄鏡像。
- 錯誤表現 → 失敗原因 → 修正方法: 只比較原始正文 → 時間戳和隨機 ID 製造假差異 → 規範化並比較欄位和不變量。
- 錯誤表現 → 失敗原因 → 修正方法: 永久鏡像全部請求 → 儲存、隱私和容量無限增長 → 使用可重現採樣、配額、保留期和稽核。
- 錯誤表現 → 失敗原因 → 修正方法: 只看全域差異率 → 小型關鍵端點可能在綠燈總指標中失敗 → 按端點、租戶、地區和嚴重度設門檻。
追問及應對
如果端點會寫資料庫怎麼辦?
把影子請求路由到一次性資料庫或交易 stub,用 fake 記錄付款、郵件等外部呼叫意圖。無法隔離的端點就排除,並明確說明覆蓋缺口,不要假裝結果安全。
如果捕獲佇列滿了怎麼辦?
主要請求選擇 fail-open:丟掉鏡像副本、增加帶標籤的指標,超過丟棄預算再告警。主要路徑背壓會破壞安全屬性。
如何處理個人可識別資訊?
捕獲時給欄位分類,在持久化前去識別化或令牌化,加密正文引用,限制保留期並稽核存取。敏感正文的 hash 仍可能具備識別性,不能自動視為安全。
網路流量鏡像能取代應用層鏡像嗎?
不能。網路鏡像複製流量到分析目標,應用層鏡像理解端點語意、憑證、租戶策略和回應比較。網路鏡像適合檢查網路,行為驗證需要應用層路徑。