題幹與適用場景
請設計一個多租戶 Consent Receipt Ledger,記錄使用者同意、撤回與處理目的變更,並支援稽核查詢。題目適用於系統設計、隱私工程與平台基礎設施面試。重點是把同意記錄建模為可追溯事實,而不是可覆蓋的布林欄位。
面試官考察點
- 能否定義同意事件、目的版本、資料類別、證明材料與撤回語義。
- 能否確保租戶隔離、追加寫完整性、冪等與可驗證的查詢結果。
- 能否處理撤回向下游傳播、延遲消費者、失敗重試與歷史更正。
- 能否在隱私最小化、可稽核性、查詢效能與保留期限之間取捨。
回答前需要釐清的問題
先確認主體是終端使用者還是企業管理員,同意範圍按目的、資料類別、地區或處理者區分。問清峰值事件量、查詢維度、稽核時限、跨區域儲存、撤回是否立即生效,以及下游系統是否能回執。也要明確是否需要機器可讀匯出、法律凍結、刪除請求與租戶自帶金鑰。
30 秒回答框架
「我會用版本化目的與追加事件流記錄每次授予、更新、撤回與傳播結果。寫入路徑按租戶分區並冪等,讀取路徑返回截至某時間點的有效狀態與證據鏈。撤回透過可靠訊息通知下游,失敗進入重試與人工複核。加密、最小欄位、租戶金鑰與保留策略共同限制洩漏風險。」
分步驟深入解答
- 領域模型:定義主體、租戶、目的版本、資料類別、同意來源、語言、時間、證明文字與狀態轉移。
- 寫入與完整性:採用追加事件與單調序列,使用請求冪等鍵;以雜湊鏈或簽章防止靜默改寫,並將金鑰輪換與租戶隔離分開。
- 狀態讀取:由事件投影生成按主體與目的查詢的目前狀態,同時保留事件位置、投影版本與證據引用。
- 撤回傳播:把撤回發布給下游處理者,記錄每個接收者的確認、重試與最終失敗,不把「已發送」冒充「已停止處理」。
- 營運與治理:設置分區、冷熱儲存、存取稽核、刪除與法律凍結優先級,提供租戶授權的匯出與分頁查詢。
高品質示範回答
我會把帳本分成不可變事件層、可重建投影層與受控證據儲存。事件至少包含租戶、主體識別的不可逆引用、目的與版本、資料類別、動作、來源、時間、策略版本與請求冪等鍵;原始同意文字或介面快照放在加密儲存,不直接暴露給一般查詢。每個租戶有獨立分區與金鑰範圍,事件按租戶序列追加,使用雜湊鏈與簽章偵測靜默修改。查詢服務先讀取投影得到某時刻的有效狀態,再返回對應事件位置與證據引用。撤回事件進入可靠佇列,逐一下游處理者追蹤確認;逾時或拒絕會重試並升級,狀態明確區分已記錄、已發送、已確認與失敗。事件投影可從帳本重播,支援目的版本變更與歷史更正。最後以租戶隔離測試、重複請求、亂序事件、金鑰輪換、撤回延遲、匯出權限與刪除凍結演練驗證系統。
常見錯誤
- 只保存
consent=true,覆蓋目的版本與撤回歷史。 - 把下游通知成功當成下游已經停止處理。
- 用可編輯資料庫列取代追加事件,無法證明歷史是否被改寫。
- 在全域索引放置可識別主體或租戶資訊,破壞隔離與最小化。
- 只設計寫入,不說明亂序、重試、投影重建、刪除與法律凍結。
追問及應對
使用者重複點擊同意怎麼辦?
用請求冪等鍵與事件指紋去重,但保留來源或介面版本變化等有意義的更新。查詢返回最終狀態,同時能追溯被合併或忽略的請求。
目的版本變更需要重新同意嗎?
把目的文字與版本作為不可變引用。若新版本擴大處理範圍,就產生待重新同意的狀態;不能把舊版本同意自動套用到新目的。
帳本如何支援刪除請求?
先區分必須保留的稽核證據與可刪除的主體資料,使用不可識別引用與加密抹除降低風險。法律凍結優先於普通刪除,並把刪除範圍與例外記錄為受控事件。
如何證明查詢結果沒有漏事件?
返回租戶序列範圍、投影版本與事件校驗摘要。稽核工具可從事件層重播同一時間點,與投影結果比對並發出警報。