跳轉到

D-20260814-18|玩家賽事歷史採有界 cold lazy pagination

背景與驅動力

單場查詢已能在 hot miss 後拉取 cold partition,但玩家最近賽事 API 只讀 hot,超出保留窗的結果會 靜默消失。若直接無界掃描所有季度,又會讓一次首頁請求的網路與記憶體成本隨歷史長度成長。

考慮過的選項

  • 只顯示 hot:快速但會把資料保留窗誤當完整歷史,棄。
  • 一次掃完全部 cold:結果完整但成本無界,且 pinning 缺塊會讓整頁長時間懸掛,棄。
  • 有界分頁、明確 partial/failure 與可重試游標(採納)。

決定

  • 先讀 hot,再按 quarter 由新到舊 lazy fetch cold;以 matchId 去重,固定按 finishedAt DESC, matchId ASC 排序。
  • 預設單頁 20、單頁上限 50、單次最多掃描 4 partitions,集中為具名參數並在 API 邊界 clamp。
  • opaque cursor 綁定 PeerId;達頁面/掃描上限回 partial + nextCursor,不可靜默截斷。
  • 區塊缺失時停在原 partition:有既有列為 partial,無列為 failure;回報失敗 partition,retry 從同一位置續讀且不重複資料。
  • online-ready 首頁是首個 UI consumer,呈現載入、部分、失敗、續載與重試四語文案;列可開啟既有 正式結果頁。本機測試結果不混入這份 ledger 歷史。

後果與影響

舊比賽不再因 hot window 靜默消失,單次 cold 成本仍有硬上限;pinning 暫時缺塊不會被誤判為歷史 到底。游標是 API 契約而非可供 UI 解讀的資料格式,未來可改內部編碼而不改頁面行為。