題目與適用情境
租戶關閉後,系統收到刪除請求。租戶資料分散在主資料庫、物件儲存、搜尋索引、快取與備份中,刪除流程不能阻塞請求執行緒,也不能因某個下游暫時不可用就悄悄遺失任務。面試重點是編排、冪等、失敗恢復,以及「完成」如何由證據支持。
面試官考察什麼
面試官會看你能否先界定刪除語義,再拆出可靠的非同步工作流。高品質設計要說明資料清單、狀態機、任務分片、冪等鍵、重試與死信、並發控制、可觀測性與最終證明。物件儲存文件明確區分立即刪除、版本與生命週期規則;多副本與非同步刪除代表「主庫刪除成功」不能直接等於所有副本都已處理。
回答前要釐清的問題
先問刪除範圍是單一租戶、單一使用者還是部分資源;硬刪除、延遲刪除與保留期如何定義;備份是否需要立即清除還是於保留窗口後過期;哪些稽核記錄必須保留但不能包含原始個人資料;一致性目標、預計完成時間、租戶規模與法規邊界是什麼。不要自行承諾無法核驗的法律期限。
30 秒回答架構
可以這樣開場:「我先建立租戶資料目錄與刪除策略,再用帶版本的刪除作業編排各儲存適配器。請求只建立一個冪等的 deletion job,由佇列驅動分階段執行;每個階段記錄確認憑證、重試次數與最後錯誤。只有主資料、衍生索引、快取與允許範圍內的備份都達到策略狀態,驗證器才把作業標記為完成,否則進入人工處理或延遲重試。」
分步深入分析
第一步:建立資料目錄與刪除策略
為每種資源登記租戶歸屬、儲存位置、衍生關係、刪除方式、保留窗口與驗證方法。把無法即時刪除的備份或日誌標為策略例外,說明何時過期、誰核准,以及如何防止保留期間被業務重新讀取。
第二步:提交冪等的刪除作業
關閉流程產生全域 deletionJobId,以租戶代數或關閉事件版本作為冪等條件。介面快速回傳已接受狀態,重複請求回傳同一作業;不要在請求執行緒串行呼叫所有下游。作業快照保存當時的資料目錄版本,避免目錄變更造成任務邊界漂移。
第三步:按依賴拆分可重試任務
先凍結寫入或切換租戶狀態,再刪除主庫記錄與物件,隨後清理搜尋索引、快取與衍生檔案。每個適配器使用 (deletionJobId, resourceId, generation) 作為冪等鍵;成功、已不存在與可安全重試的錯誤都要有明確結果。不可重試錯誤進入死信佇列並保留人工處理入口。
第四步:處理副本、版本與備份
物件儲存可能存在版本、生命週期與跨區域副本;刪除 API 回傳成功不代表所有非同步副本立即完成。為每個副本記錄請求時間、觀察到的版本或刪除標記與最後檢查時間。備份依策略進入保留倒數,驗證器在過期窗口後確認不可恢復,而不是假裝即時清除。
第五步:設計驗證器與完成狀態
驗證器從目錄反查每個資源,檢查主庫查詢、索引搜尋、快取讀取與物件清單。狀態機至少區分 ACCEPTED、RUNNING、WAITING_RETRY、BLOCKED、VERIFIED 與 FAILED;只有所有必要資源都有憑證且策略例外已明確,才能進入 VERIFIED。狀態更新使用條件寫入,避免舊重試覆蓋新結果。
第六步:可觀測性、隔離與稽核
按租戶與作業記錄延遲、成功率、重試、死信、下游限流與剩餘資源數。刪除任務使用專用憑證與最小權限,防止跨租戶誤刪;稽核記錄只保存作業 ID、資源類型、策略版本、操作者與結果摘要,不寫入原始資料。告警要能區分單一租戶阻塞與全域下游故障。
高品質示範回答
「我會先建立資料目錄,列出主庫資料表、物件前綴、搜尋索引、快取鍵與備份策略,每項都有租戶歸屬、刪除方式與驗證查詢。關閉租戶時寫入一個不可重複的 deletionJobId,凍結新寫入並把作業放入佇列。編排器按依賴產生任務:主庫與物件先處理,索引和快取隨後清理;每個適配器用資源代數作冪等。物件版本與跨區域副本記錄刪除憑證,備份依保留策略等待過期,不把請求成功當成即時清除。驗證器定期反查主庫、搜尋、快取與物件清單,所有必要資源確認後才進入 VERIFIED。下游不可用時指數退避,超過預算進入死信並通知指定負責人。稽核只記錄策略版本、結果摘要與作業 ID,任務憑證按租戶隔離。這樣用戶取得的是可查詢的狀態與證據,而不是沒有依據的「已刪除」字串。」
常見錯誤與改進
- 只刪主庫: 先畫出資料目錄與衍生關係,再逐項定義刪除與驗證。
- 同步串行呼叫下游: 用作業佇列與狀態機隔離請求延遲和下游故障。
- 把重複執行當成異常: 為每個資源定義冪等鍵,並區分已不存在與真正失敗。
- 承諾即時清除所有備份: 明確保留窗口、生命週期與可驗證的過期狀態。
追問及應對
某個下游連續失敗,用戶應看到什麼?
回傳可查詢的作業狀態、階段、最後錯誤類別與下一次重試時間,不回傳敏感的內部憑證。超過預算進入 BLOCKED 或 FAILED,通知負責人並保留重新執行能力。
如何避免舊任務刪除新寫入的資料?
關閉寫入或使用租戶代數;每個刪除操作攜帶建立時的代數,儲存層條件檢查不匹配就拒絕執行。目錄與狀態更新也使用版本條件寫入。
怎樣測試「已驗證」沒有誤報?
用故障注入覆蓋重複訊息、部分副本延遲、索引重建、快取回填與備份恢復;驗證器在模擬查詢仍能讀到資料時必須保持未完成,並記錄證據缺口。
稽核日誌本身也包含租戶資訊怎麼辦?
只寫不可逆的租戶引用或雜湊化識別、作業 ID、策略版本與結果摘要,限制存取並設定獨立保留策略。稽核的目標是證明處理過程,不複製被刪除的資料。