大型檔案處理 (Handling Large Blobs)

核心問題

大型檔案(影片、圖片)放 Blob Storage(S3),不放 DB —— 100MB BLOB 會讓查詢、備份、replication 全崩。粗略標準:> 10MB 且不需 SQL 查詢 → Blob Storage(S3 提供無限容量、11 個 9 耐久性)。

但 Blob Storage 沒解決資料傳輸問題。標準做法讓 bytes 流過 application server(client → API server → S3),檔案越大越撐不住:

Application server 變成毫無價值的管道

它對傳輸毫無貢獻,只增加延遲和成本。雲端供應商本有全球基礎設施和巨大頻寬,我們卻把有限的 app server 插在中間製造瓶頸。


解法:直傳 + CDN 直download

不讓資料流過你的伺服器,而是給 client 臨時、有範圍限制的憑證,讓它直接和儲存服務互動。Server 角色從「資料傳輸者」變「存取控制者」:驗證 → 產生憑證 → 退場。

類比:演唱會驗票口

你不會陪每個人走到座位。驗證身份、給手環,讓他們自己找位子。系統只驗證一次授權,然後讓 client 直接和儲存服務互動。

Presigned URL(簡單直傳)

Server 不收檔案,只收「請求上傳許可」→ 驗證用戶/配額 → 產生臨時上傳 URL(15 分~1 小時)。

產生 Presigned URL 不需呼叫 Blob Storage

完全在 app 記憶體裡用雲端憑證簽名。儲存服務之後用自己保存的憑證複算雜湊驗證。

限制條件烘焙進簽名(任何人有 URL 都能用,所以產生時就限制):

簽名驗證者的差異(下載)

方式 由誰驗證 機制
S3 Presigned URL 儲存服務(持有 secret key) 對稱簽名
CloudFront 簽署 URL CDN edge(持公鑰,你持私鑰) 公私鑰密碼學,edge 不需回 origin

直接從 Blob Storage 下載:簡單便宜,適合不頻繁;CDN:貴但地理分散 + 快取,適合頻繁存取。


大型檔案斷點續傳(Resumable Upload)

5GB 影片在 100Mbps 要 ~7 分鐘,99% 時斷掉就得重來。所有雲端供應商用分塊上傳解決:

供應商 分塊機制 分塊大小
AWS S3 Multipart Upload(每塊獨立 Presigned URL) 5MB~5GB
GCS Resumable Uploads(單一 session URL + Range header) 彈性
Azure Block Blobs 4MB~100MB

斷線時 client 不從頭開始:查詢哪些分塊已成功(S3 ListParts)→ 從第 61 塊繼續。進度追蹤隨分塊自動產生。

完成步驟與清理

所有分塊傳完後 client 必須呼叫完成端點(帶分塊編號 + 校驗和),儲存服務才組裝成最終物件。在此之前只有分塊、沒有可存取的完整檔案。未完成的 Multipart Upload 要收費 → 設生命週期規則 24~48 小時自動清理。


狀態同步的挑戰(最容易卡關)

把 server 移出傳輸路徑後,引入分散式狀態管理:metadata 存 DB、檔案存 Blob Storage,是兩個獨立系統、不同時間更新。

最簡單做法是信任 client(上傳完呼叫 API 說「完成了」),但問題多:

問題 說明
Race condition DB 顯示 completed 但檔案還沒到 Storage
孤兒檔案 client 上傳後、通知前崩潰 → Storage 有檔案、DB 無記錄
惡意 client 沒上傳就標記完成
網路失敗 完成通知根本沒抵達
正解:事件通知 + 對帳(reconciliation)

主機制用 Storage 事件(S3 → SNS/SQS,帶 storage_key)—— 由儲存服務本身確認什麼存在,client 移出信任鏈。
安全網用對帳:定期任務檢查卡在 pending 的檔案,和 Storage 比對。
「以事件為主、對帳撈漏網之魚」→ 不犧牲直傳效能下維持一致性。


常見 Deep Dive


何時用 / 何時不用

✅ 適合(> 10MB) ❌ 不適合
YouTube 影片上傳、Instagram 相片、Dropbox、Messenger 媒體 小檔案(< 10MB JSON / 表單)→ 一般 API 端點
需同步驗證(CSV 匯入要先驗 header)→ 讓資料流過 server
合規要求(金融掃信用卡號、HIPAA)→ 流過認證系統
需即時回饋(上傳大頭照馬上要人臉偵測結果)→ async 本質會破壞體驗
核心洞察

從「讓 bytes 流過你的基礎設施」轉移到「編排存取權限 + 管理分散式狀態」。狀態同步是許多面試者卡關的地方。