具代表性的面試主題

如何設計時序指標的分層保留與降採樣服務?

系統設計困難
OfferCC 編輯團隊發佈 更新

題幹

監控平台每天寫入數十億條帶標籤時序樣本。請設計一套保留 15 天高解析度、2 年低解析度資料的系統,說明降採樣、查詢路由、標籤基數與資料校驗。

1. 題目

平台接收服務、租戶與區域標籤的時序指標,短期排障需要秒級資料,長期報表只需要分鐘或小時趨勢。寫入量持續成長,要求保留 15 天原始樣本與 2 年聚合樣本,同時控制成本並避免高基數拖垮查詢。

2. 約束與澄清

  • 先確認取樣間隔、標籤數量與基數、查詢範圍、SLO、允許的資料延遲與刪除合規要求。
  • 區分原始樣本、固定視窗聚合、recording rule 預計算結果與長期歸檔。
  • 不能用簡單平均替代 counter、histogram 或分位數;聚合函式必須保留指標語義。
  • 明確寫入至少一次、重複樣本、亂序時間戳與租戶隔離策略。

3. 核心架構

採集層先做標籤白名單、基數預算與批次壓縮,再寫入按時間分塊的熱儲存。查詢層根據時間範圍與解析度路由:短視窗讀原始區塊,長視窗讀預聚合區塊,必要時拼接並標註解析度。降採樣工作以可重播的時間視窗讀取原始資料,輸出帶來源版本的聚合區塊,完成校驗後再刪除過期原始區塊。

4. 參考流程

text
ingest(sample):
  series = canonicalize(metric_name, sorted_labels)
  enforce_cardinality_budget(series)
  append_to_time_partition(series, sample)

downsample(window):
  raw = read_raw(window)
  agg = aggregate_by_metric_semantics(raw, resolution=5m)
  write_versioned_block(window, agg, source_watermark)
  verify_counts_checksums_and_watermark(agg)

query(range, step):
  blocks = choose_resolution(range, step)
  return merge_with_gap_and_resolution_metadata(blocks)

Counter 可保存增量與重置資訊,gauge 可保存 min/max/avg,histogram 要合併 bucket 或原生 histogram 結構。查詢結果應攜帶實際解析度、覆蓋範圍與缺口,避免使用者把降採樣資料誤當成原始精度。

5. 一致性與成本取捨

降採樣可能因遲到樣本或重複執行而產生不同結果,因此工作要使用 watermark、版本號與冪等寫入;視窗關閉後仍需定義修訂期。高基數標籤會同時放大記憶體、索引與查詢成本,應限制任意使用者標籤、按租戶配額或預聚合。更高解析度、更長保留期與更低查詢延遲之間存在直接儲存與計算成本。

6. 驗證與觀測

  • 對每個時間視窗校驗輸入輸出樣本數、counter 增量、bucket 總量、校驗和與 watermark。
  • 重播同一視窗多次,確認冪等且結果版本可替換。
  • 監控寫入拒絕率、系列數、查詢樣本數、降採樣延遲、缺口率與儲存成本。
  • 用真實故障查詢對比原始與聚合結果,確認尖峰、重置與異常不會被平均抹平。

7. 常見誤區

  • 只按時間平均所有指標,破壞 counter、分位數或 histogram 語義。
  • 標籤字串未排序就作為系列鍵,造成重複系列與錯誤基數。
  • 降採樣完成前刪除原始區塊,失敗後無法重播或修訂遲到資料。
  • 查詢路由只看時間範圍,不考慮 step、缺口與解析度元資料。

8. 面試評分點

能定義分層資料模型

應區分原始、預聚合與歸檔資料,說明每層解析度、保留期與查詢用途。

能保持指標語義

應分別處理 counter、gauge、histogram 與分位數,避免用一個平均函式覆蓋所有類型。

能控制基數與成本

應提出標籤規範、租戶配額、寫入拒絕與儲存預算,並解釋查詢與成本的關係。

能設計可重播驗證

應使用 watermark、版本、冪等寫入與重播校驗,監控缺口、延遲與異常尖峰保真度。

公開來源

同類題目

資源

產品比較

每份比較均依官方資料整理,並標示複核日期。

查看完整比較

相關面試工具

用 Solve 整理系統設計回答

從澄清需求開始,展開規模、架構、元件選擇和取捨。

查看工具