題干與適用場景
這是平台、後端與系統設計職位的漸進發布題。目標是讓應用不重新部署也能控制功能曝光,同時把每次請求的評估延遲維持在本地記憶體等級。假設有多個環境、租戶與服務,旗標更新遠少於評估讀取。
面試官考察點
- 是否把寫入較少、讀取頻繁的控制面與資料面分開。
- 能否解釋為什麼評估不能在請求熱路徑呼叫遠端資料庫。
- 是否處理穩定百分比分桶、版本傳播、預設值與舊設定過期。
- 能否把緊急關閉、稽核、權限與旗標生命週期納入設計。
回答前需要釐清的問題
先確認評估在服務端 SDK、邊緣還是用戶端完成;這決定機密屬性能否進入上下文。再確認一致性窗口、緊急關閉的目標傳播時間、是否需要多變量實驗、每個環境是否隔離,以及旗標服務不可用時應安全關閉還是維持最近狀態。最後詢問資料規模;下面採用每秒 10 萬次評估、每次請求本地計算、數千個活躍旗標的示例假設。
30 秒回答框架
我會把系統拆成控制面與資料面:控制面負責旗標 CRUD、權限、審批、版本與稽核;資料面由 SDK 持有簽名設定,在程序內按規則評估。更新透過 SSE 或版本輪詢傳播,斷線時使用最近有效設定與明確預設值。百分比發布用 hash(targetingKey + flagKey) 穩定分桶,緊急關閉走高優先級更新通道。指標涵蓋評估錯誤、設定年齡、傳播延遲、分桶穩定性與旗標清理。
分步驟深入解答
- 劃分邊界。 控制面寫入關聯式資料庫,保存環境、旗標、變體、規則、版本、擁有者、過期時間與稽核事件。資料面只分發已驗證設定,不讓業務請求依賴控制面。
- 設計評估路徑。 SDK 啟動時拉取設定並放入記憶體;請求只讀取本地快照。規則按優先級匹配屬性,未命中或型別不符時回傳呼叫方提供的預設值。OpenFeature 也要求異常評估回到預設值,避免旗標服務拖垮業務。
- 保證分桶穩定。 對同一
targetingKey與flagKey做穩定雜湊,再映射到固定桶。從 10% 增加到 30% 時保持舊使用者順序,避免使用者重新整理後變體來回切換;不同旗標必須把flagKey納入雜湊以相互獨立。 - 傳播更新。 控制面發布帶單調版本的事件,串流服務向 SDK 推送。SDK 只接受簽名正確且版本較高的快照;SSE 斷線後退回帶版本的輪詢。過期設定繼續服務前要有最大年齡,超過期限進入安全預設或告警狀態。
- 處理緊急關閉。 全域 kill switch 是高優先級旗標,評估前先檢查本地緊急狀態。它可以走獨立快速通道,但仍需記錄操作者、原因、版本與恢復條件,避免一次誤操作造成全量關閉。
- 估算與隔離。 以每秒 10 萬次評估為例,若每次本地評估約 1 次雜湊加少量規則掃描,遠端讀取降為設定更新流量;最壞規則數量仍需限制。按租戶、環境與應用隔離設定,並限制規則大小,防止一個團隊耗盡 SDK 記憶體與傳播頻寬。
- 可觀測與清理。 記錄 provider 狀態、設定版本、預設值命中、評估錯誤與傳播年齡;不要在每次熱路徑評估寫日誌,可用取樣或 hook。旗標必須有 owner、建立時間、過期時間與最後評估時間,發布完成後刪除程式分支與設定。
高品質示範回答
我會先把控制面與資料面分開。控制面提供帶權限與審批的 CRUD,寫入旗標、規則、變體、版本、owner、過期時間與稽核事件;資料面把經過簽名與版本驗證的快照推送給服務端 SDK。業務請求只在 SDK 記憶體中評估,不能每次存取遠端旗標資料庫。
control API -> config store -> versioned event -> stream/poll -> SDK snapshot
request -> SDK.evaluate(flagKey, context, default) -> value + evaluation details百分比規則使用 hash(targetingKey + flagKey) 的穩定桶,擴大比例時保持使用者順序。SDK 斷線繼續使用未過期快照,超過最大年齡則回傳安全預設值並告警。kill switch 走高優先級更新,評估結果帶版本與原因供遙測使用。最後用設定年齡、傳播延遲、預設值命中率、錯誤率與實驗護欄指標決定是否繼續擴大曝光,並定期清理已完成旗標。
常見錯誤
- 每次評估查詢資料庫 → 延遲與故障會進入業務熱路徑 → SDK 本地快照評估。
- 用亂數做百分比分流 → 使用者重新整理後變體漂移 → 使用包含使用者鍵與旗標鍵的穩定雜湊。
- 設定斷線時永遠維持舊值 → 舊規則可能已違反安全邊界 → 設定最大年齡、預設值與告警。
- 把 kill switch 與普通更新放同一佇列 → 高峰時關閉延遲 → 設計高優先級通道並記錄稽核。
- 只設計發布,不設計刪除 → 旗標分支與規則會累積 → owner、過期時間與清理檢查一起交付。
追問及應對
SDK 設定落後時,如何避免不同實例展示不同結果?
給快照附版本與年齡,暴露 provider 狀態;對必須一致的操作在版本不足時回傳安全預設或阻斷,普通體驗則允許短暫最終一致。不要假裝所有旗標都需要強一致。
規則包含個人隱私屬性時,評估放在哪裡?
不能把敏感屬性下發到不受信任的用戶端。把評估放在服務端或邊緣,僅傳遞最小化上下文;用戶端旗標只使用可公開、低風險屬性,並對設定簽名與環境隔離。
如何驗證 30% 發布確實穩定?
用固定使用者鍵重複評估同一旗標,檢查變體不漂移;改變比例時比較桶邊界與實際分布。再按變體記錄業務指標,區分旗標曝光與實驗結論。
旗標服務完全不可用怎麼辦?
SDK 使用最後一個未過期快照;超過最大年齡按旗標定義的安全預設處理,並讓 provider 狀態進入錯誤或過期狀態。關鍵支付或安全路徑應選擇關閉功能的預設值。