題目與適用場景
每個視圖查詢來源資料表或其他視圖。來源資料變更會使後代失效,但立即重算所有後代成本過高。系統應提供帶版本的結果並暴露新鮮度,不能把不同代的父視圖拼在一起。假設刷新可以非同步執行,並保留全量重建作為恢復手段。
面試官考察點
- 建模相依邊、版本、失效和拓撲刷新順序。
- 根據變更量和查詢形態選擇增量或全量重算。
- 處理陳舊結果、部分失敗、回填、熱門鍵和快取驅逐。
- 用血緣、清單、校驗和與可重播事件證明正確性。
回答前需要釐清的問題
確認每個查詢是否有新鮮度 SLO、連接是否能增量維護、更新和刪除如何到達,以及讀者是否寧願接受陳舊答案而非錯誤。不可逆聚合發生變化時可能需要更大範圍重算;只追加資料的視圖更適合增量刷新。
30 秒回答框架
為每個視圖保存帶版本清單:相依版本、輸出位置、列數、校驗和和新鮮度時間。來源變化追加失效事件,排程器按拓撲順序處理受影響後代;查詢支援時使用增量刷新,否則全量重建。只有所有必要父視圖匹配目標代後才原子發布新清單。讀取選擇完整代,策略允許時可使用有界陳舊代,並展示年齡。重播、校驗和與定期全量重建用於修復偏差。
分步深入解答
1. 表示 DAG 和資料代
每個視圖擁有穩定 ID、查詢定義、父 ID 和 generation。刷新計畫攜帶目標來源水位,並記錄使用的父代。如果刷新期間父視圖變更,發布前拒絕該計畫,使用新水位重試,不能靜默混合結果。
2. 選擇增量或全量刷新
以變更量、連接形態和聚合是否可逆作為判斷規則。引擎能證明增量足夠時只讀取變更分割區或資料列;複雜連接或刪除場景使用全量刷新更簡單。新清單驗證前保留舊代,刷新失敗不會移除最後一個正確答案。
3. 排程失效並控制熱門視圖
把多個來源事件合併到一個目標水位,每代只處理一次受影響節點。按查詢需求和新鮮度欠帳排序,同時限制每個來源的並發工作,避免熱門上游耗盡計算資源。按視圖參數和代快取熱門結果,以代號失效,而不是逐個刪除所有鍵。
4. 恢復、回填並證明正確
持久化失效事件和刷新清單,讓 Worker 崩潰後可以繼續。回填使用獨立目標代,只有與目前代比較後才發布。比較列數、校驗和、抽樣聚合與血緣水位;視圖超過五分鐘目標或父代不一致時告警。定期全量重建可作為檢測增量漂移的基準。
高品質示範回答
我會先確認按視圖的新鮮度、更新/刪除行為和是否允許陳舊讀取。每個視圖清單包含父代、來源水位、輸出位置、校驗和和新鮮度。失效事件進入排程器,合併工作並按拓撲刷新後代。可證明增量的查詢使用增量刷新,複雜連接或刪除使用全量重建,並原子發布新代。讀取絕不混合代;允許時返回帶年齡的有界陳舊代。重播、回填代、校驗和與定期全量重建讓正確性可測試。
常見錯誤
- 每次來源變更立即刷新所有後代 → 突發時重複計算 → 按目標水位合併事件。
- 原地覆蓋唯一結果 → 失敗工作留下半成品 → 以不可變代原子發布。
- 假設所有聚合都可增量 → 刪除或不可逆函數造成漂移 → 按查詢形態決策並保留全量回退。
- 快取沒有代資訊 → 父子答案可能不一致 → 快取鍵綁定完整代。
- 熱門視圖耗盡所有 Worker → 其他新鮮度 SLO 失敗 → 限制來源級和視圖級並發。
- 只相信列數 → 靜默損壞長期存在 → 比較校驗和、抽樣、血緣水位和全量重建。
追問及應對
父視圖刷新時子視圖正在執行,怎麼辦?
子視圖記錄讀取的父代。發布時若該代已不是目前代,就丟棄或按新目標水位重試,不能發布混合代。
一個原本增量的視圖出現刪除,還能增量刷新嗎?
只有變更日誌和查詢語意保留足夠資訊來減去舊貢獻時才可以。否則擴大受影響分割區或安排全量重建,並說明新鮮度取捨。
如何防止回填覆蓋更新資料?
為回填分配獨立代和來源水位。只有覆蓋目標範圍且不取代更新分割區時才發布,並按明確範圍和代規則合併清單。
視圖查詢遠多於刷新,怎麼辦?
返回帶年齡的最後完整代,按新鮮度欠帳提高優先級,必要時預先計算熱門參數鍵。不能隱藏陳舊,也不能讓讀取繞過刷新並發限制。