HUAN 讙 · 開發者

ADR-0003:物件儲存只做暫存,不當永久素材庫

狀態

已採用

背景

上傳的影片與圖片要放在哪裡?最常見的答案是「放在物件儲存裡,永遠留著」。

決策

RustFS 只做暫存與派送:

  • 原始檔在轉檔成功後立即刪除
  • 縮圖與預覽長期保留(它們很小)。
  • 播放產物在所有目標裝置都 ACK 且經過保留期後回收
  • 正式的播放副本最終保存在裝置本機

當某個素材已經沒有任何可派送的副本時,把它標記為 NEEDS_REUPLOAD 並在介面上誠實顯示。

理由

原始檔在系統裡沒有讀者。 一支 4K 原始影片可能有 8 GB,轉檔後的播放版本只有 200 MB。播放用轉檔版、預覽用預覽版、縮圖用縮圖——沒有任何功能會去讀那 8 GB 的原始檔。留著它只是讓儲存成本隨上傳量線性成長。

播放副本已經在裝置上了。 素材的用途就是被裝置播放。所有目標裝置都下載完成並驗證通過之後,RustFS 上那份副本就沒有讀者了。

這是一個產品定位的決定。 HUAN 是播放系統,不是數位資產管理系統。想要保存原始母帶的人應該用 DAM,而不是期待看板系統替他做備份。

後果

這個決定有一個真實的、使用者會遇到的代價

原始檔已刪除、播放產物也已回收之後,如果你新增一台裝置,或某台裝置清掉了本機儲存,這份素材就無法重新派送,必須重新上傳。

我們選擇正面處理這件事:

  • 資料模型本身能表達這個狀態(media_variants.available)。
  • 後台會明確顯示「需要重新上傳」,並解釋原因。
  • 文件在多個地方說明這個限制。
  • 保留期可以透過 DISTRIBUTION_RETENTION_HOURS 調整,設成 720 就等於一個月內都能重新派送。

不會做的事:假裝伺服器還留著不存在的檔案,然後在派送的時候才失敗。

回收前的兩道保護也很重要:必須所有目標裝置都 ACK(不能第一台成功就刪),而且必須經過保留期(吸收 ACK 與重試之間的競態)。

替代方案

永久保留原始檔:儲存成本無上限地成長,而且那些檔案沒有讀者。

永久保留播放產物:比保留原始檔便宜得多,也確實避免了重新上傳的問題。這是最值得未來重新評估的選項——只要把 DISTRIBUTION_RETENTION_HOURS 設得夠大,實務上就等於這個方案。目前的預設值選擇了成本,而不是便利。