題干與適用場景
這道系統設計題適合平台、後端和 SaaS 基礎設施職位。計費系統發出方案與付款事件,產品服務需要回答「租戶 T 的主體 U 是否可以使用功能 F」。假設 50,000 個租戶、1,000 萬個主體、尖峰每秒 100,000 次決策請求,月可用性目標 99.99%。取消或暫停後的授權不能無限期繼續生效,但計費故障也不能拖垮所有讀取路徑。
面試官考察點
- 能否把計費作為商業事實來源,把授權快照作為讀取模型。
- 是否定義租戶與主體隔離,以及方案、加購、試用和拒絕規則的優先順序。
- 能否處理事件亂序、快取陳舊、撤銷延遲,以及故障時放行或拒絕的取捨。
- 是否提供版本化 API、稽核記錄、可觀測性與可重播復原路徑。
回答前需要釐清的問題
確認決策按租戶、使用者、服務帳號還是席位;功能能否只給子集;取消後多久必須撤銷;是否包含用量配額;每次決策是否需要可解釋原因。確認計費事件是否至少一次投遞、能否亂序到達。這些答案會改變快照結構、事件處理、快取 TTL 和故障策略。
30 秒回答框架
我會保留計費為權威來源,建立按租戶、主體範圍、功能和版本索引的授權投影。寫入流程消費去重且按版本處理的訂閱事件,計算新快照並發布失效通知。讀取 API 依明確優先順序評估快照,回傳允許、拒絕、原因和版本。區域快取服務熱門讀取,撤銷柵欄或版本柵欄限制陳舊授權。低風險功能才允許有限時間放行;付費或安全敏感功能故障時拒絕,並提供復原路徑。所有變更和決策都可稽核。
分步驟深入解答
- 定義契約。
Evaluate(tenantid, subjectid, feature, context)回傳決策、原因碼、快照版本和到期時間。上下文可包含方案、區域、席位或灰度屬性;OpenFeature 要求唯一 targeting key 並支援自訂欄位,不應把計費狀態塞進一個無結構字串。 - 保存不可變授權事實。 記錄訂閱產品、加購、試用、席位、起訖時間和明確拒絕等帶版本事實。投影保存解析後的功能集合及來源事實 ID。暫停或合規拒絕覆蓋普通授權;試用到期只改變目前投影,不改歷史。
- 建立傳播流程。 計費事件帶租戶、訂閱版本、事件 ID 和生效時間。inbox 去重事件 ID、拒絕舊版本,並在交易中寫入事實與投影。outbox 發布
entitlementversionchanged,消費者按租戶和功能讓快取失效。事實可重播以重建損壞投影。 - 提供讀取。 無狀態評估 API 讀取本地快取或區域儲存。快取鍵包含租戶、主體範圍、功能和策略版本;條目攜帶投影版本與到期時間。請求帶有更新版本柵欄時,快取落後就回源至權威區域儲存。
- 依風險選擇一致性。 設定可測的撤銷 SLO,例如普通取消 60 秒,詐欺或安全暫停接近即時。把拒絕柵欄寫入強可達儲存;服務拒絕早於柵欄的快取允許。不要在不付同步成本的情況下承諾零陳舊讀取。
- 處理故障與擴展。 按租戶分割事件以保持租戶內順序,按租戶雜湊分片投影,並隔離熱門租戶。計費延遲時暴露最後套用版本並告警。快取或區域儲存故障時,只有低風險功能使用有界陳舊窗口;高風險功能回傳有型別的依賴錯誤,不靜默放行。
- 稽核與驗證。 記錄誰改了方案、哪個事件版本產生投影、決策依據。監控事件延遲、投影年齡、快取命中率、陳舊允許攔截、決策延遲和跨租戶授權失敗。測試亂序、重複投遞、時鐘偏差、請求中途取消、租戶遷移和空投影重播。
高品質示範回答
我會把商業事實和版本化授權投影分開。計費事件攜帶事件 ID、租戶、訂閱版本、生效時間和變更產品。inbox 去重並拒絕舊版本,接著在交易中寫入事實、解析後功能快照和 outbox 通知。評估 API 回傳允許或拒絕、原因、投影版本和到期時間。快取鍵必須包含租戶和主體範圍,避免客戶之間串讀。
關鍵取捨是撤銷。我會給普通取消設定 60 秒 SLO,為詐欺或安全暫停發布拒絕柵欄。每個快取允許攜帶投影版本;發現更新柵欄就回源區域儲存。低風險介面功能在儲存故障時可使用有限陳舊窗口,付費資料匯出或安全控制則應拒絕並回傳有型別依賴錯誤。稽核記錄關聯每個決策的事件與策略版本,重播任務可從不可變事實重建投影。
常見錯誤
- 每次請求同步讀取計費表 → 付款延遲和故障變成授權故障 → 將不可變事實投影成讀取最佳化快照。
- 只按功能快取 → 可能把其他租戶或主體的決策回傳給目前請求 → 鍵中加入租戶、主體範圍和策略版本。
- 按到達順序套用事件 → 舊取消或續訂覆蓋新狀態 → 去重事件 ID 並拒絕低於目前版本的事件。
- 承諾處處即時撤銷 → 隱藏網路和快取成本 → 宣告可測撤銷 SLO,並執行拒絕柵欄。
- 付費或安全功能故障時放行 → 陳舊授權變成收入或安全事故 → 按風險分類,高風險必須拒絕。
追問及應對
如何只給租戶 10% 的使用者開放功能?
把商業授權和灰度選擇分開。授權快照說明租戶擁有功能,帶穩定主體 targeting key 的評估上下文負責灰度。記錄兩次決策,讓支援人員區分「沒購買」和「灰度未選中」。
取消事件延遲到達怎麼辦?
暴露投影年齡和事件延遲,在撤銷 SLO 前告警;若已有計費版本或拒絕柵欄就直接使用。不要從缺失心跳推斷取消。事件到達後冪等套用,並讓受影響範圍全部失效。
如何遷移租戶分片?
在租戶中繼資料寫入遷移 epoch,有限切換期內雙讀,並發布柵欄阻止舊分片繼續放行。核對計數、版本和抽樣決策後再刪除舊副本;保留事實以便回滾。