跳至主要內容
Skip to content

檔案上傳系統設計 (11) —— 檔案生命週期管理

如果你是剛上線的系統,你可能感覺不到壓力。但當系統運作了三年,儲存空間達到數十 TB,且每月帳單開始讓你肉痛時,你就會意識到:檔案不能只進不出

一個成熟的檔案系統必須負責管理檔案的「生老病死」。這一篇,我們來聊聊 檔案生命週期管理 (File Life Cycle Management)


一、 孤兒檔案清理:處理系統的不一致

最常見的問題是:資料庫紀錄已經刪除了(或是因為 Bug 導致寫入失敗),但物理檔案還留在硬碟或 S3 裡。這些不被任何人引用的檔案我們稱之為 孤兒檔案 (Orphan Files)

解決策略:垃圾回收 (Garbage Collection)

你不應該在每次刪除紀錄時立即同步刪除檔案(這會拖慢性能且不易回滾)。

推薦做法

  1. 標記刪除:資料庫使用 deleted_at 軟刪除。
  2. 定時任務 (Cron Job):每週執行一次 GC 腳本。
    • 掃描物理文件目錄。
    • 檢查該文件在資料庫中是否存在對應的「未刪除」紀錄。
    • 若不存在,則將物理文件標記為可清理或直接刪除。

二、 冷熱儲存分級:省錢的藝術

並非所有檔案都一樣重要。

  • 熱數據 (Hot):使用者這三天上傳的照片,訪問頻率極高。
  • 冷數據 (Cold):使用者五年前的上傳紀錄,可能半年才被點開一次。

策略:將冷數據移往價格更低昂(但讀取較慢)的儲存介質。


三、 雲端實戰:S3 Lifecycle Policies

如果你使用 AWS S3,你完全不需要自己寫搬運腳本。你可以設定 Lifecycle Rule

  1. 轉換階層:檔案建立 30 天後,自動從 Standard (貴) 轉移到 Standard-IA (中)。
  2. 封存:檔案建立 180 天後,轉移到 Glacier (極便宜)。
  3. 過期:檔案建立 3 萬天後(或特定條件),自動執行物理刪除。

NOTE

為什麼要這樣做?Glacier 的儲存成本通常只有 Standard 的 1/10 甚至是更低。對於擁有大量歷史數據的企業來說,這每年能省下數萬美金的預算。


四、 暫存檔的自動清理

在「分片上傳」中,如果使用者傳到一半就關掉瀏覽器,後端會留下一堆「沒拼完的分片」。

建議:針對 /uploads/tmp/ 資料夾設定自動清理規則,所有超過 24 小時未修改的暫存分片都應被刪除。


總結

檔案生命週期管理是從「開發者」邁向「架構師/運維工程師」的重要一步:

  1. 防止垃圾堆積:透過 GC 機制維持系統整潔。
  2. 優化預算結構:冷熱分級讓錢花在刀口上。
  3. 自動化思維:利用雲端工具代替手動操作。

下一篇,我們將討論現代網頁最重要的效能環節:檔案防盜鏈與全球加速。


️ 進階挑戰

如果在執行垃圾回收腳本時,剛好有使用者正在上傳一個大檔案的分片,你的腳本該如何避免誤刪這些正在寫入中的「合法」暫存檔?


延伸閱讀與資源

← 上一章:私有檔案的訪問控制 | 返回專案首頁 | 下一章:檔案防盜鏈與全球加速