題目與適用情境
用戶端要上傳數 GB 檔案,網路可能中斷,行動裝置會重試甚至並發提交同一分片。服務需要讓用戶端查詢進度、補傳缺失分片,並在最終提交前後保證內容完整。面試重點是協定狀態、冪等、校驗、生命週期與物件可見性。
面試官考察什麼
面試官會看你能否把一次大請求拆成可恢復的工作階段。Google Cloud 文件把可恢復上傳定義為分多次請求傳輸,通訊失敗後可繼續;Amazon S3 multipart upload 則要求先上傳分片,再明確 complete 才組裝物件,並建議用生命週期規則清理未完成上傳。高品質回答還要說明授權、限流與重複完成的語義。
回答前要釐清的問題
先確認物件大小、分片大小與並發上限;用戶端是否能保存工作階段 URL;物件是否允許覆蓋、版本化或只能新建;完整性校驗由用戶端提供整檔摘要還是由服務端計算;上傳工作階段的保留時間、取消方式、惡意占用與租戶配額如何定義。不要把預簽名 URL 當成自動具備業務授權。
30 秒回答架構
可以這樣開場:「我把上傳拆成建立工作階段、上傳分片、查詢狀態、完成與取消五類操作。工作階段綁定租戶、物件鍵、大小、分片規則、過期時間與校驗策略;每個分片以 (uploadId, partNumber, checksum) 冪等,完成時服務端驗證連續分片與整檔摘要,成功後原子發布物件版本。逾時工作階段由背景工作清理,權限、配額與限流在建立和每次分片請求都檢查。」
分步深入分析
第一步:建立並授權上傳工作階段
POST /uploads 驗證租戶配額、物件大小、內容類型與目標權限,回傳隨機 uploadId、分片大小、過期時間與每片上傳憑證。工作階段記錄預期大小、物件鍵、版本策略與校驗演算法;用戶端不能自行指定任意儲存路徑。
第二步:設計分片冪等與狀態查詢
PUT /uploads/{id}/parts/{n} 帶上分片長度與校驗值。服務端按 uploadId + partNumber 儲存最新合法分片元資料,重複請求同一摘要回傳成功,摘要不同則回傳衝突並要求用戶端重新讀取狀態。GET /uploads/{id} 回傳已確認分片、大小與下一步動作,不洩露其他租戶資訊。
第三步:校驗資料完整性
每片先校驗長度與分片摘要,完成時再驗證分片清單連續性、總長度與整檔摘要。Amazon S3 文件說明可以使用分片或組合校驗值;校驗失敗時不能發布最終物件。摘要演算法與編碼格式要寫入工作階段,避免用戶端和服務端解讀不同。
第四步:完成與可見性
POST /uploads/{id}/complete 帶上有序分片清單和可選整檔摘要。完成操作必須冪等:同一清單重複提交回傳同一物件版本,衝突清單拒絕。只有儲存完成組裝且校驗通過後,資料庫中的物件記錄才從 UPLOADING 變為 READY,讀取介面不暴露半成品。
第五步:取消、過期與孤兒清理
用戶端可明確取消;背景工作按過期時間掃描未完成工作階段並呼叫儲存端 abort,刪除已上傳分片。清理任務也要冪等且可重試,記錄最後錯誤與成本指標。S3 文件提醒未完成分片會產生儲存費用,因此生命週期規則是最後一道防線,不能取代應用狀態管理。
第六步:安全、配額與可觀測性
每次操作驗證租戶、物件權限、工作階段狀態與分片範圍;憑證只允許存取目前工作階段,且設定短過期時間。限制單一租戶並發工作階段、總位元組數與單片大小,防止資源耗盡。監控工作階段成功率、重試、校驗失敗、過期清理延遲與孤兒位元組數,並按租戶隔離告警。
高品質示範回答
「我會先用 POST /uploads 建立工作階段,驗證租戶配額與物件大小,產生隨機 uploadId、固定分片大小、校驗演算法與 24 小時過期時間。每片請求帶編號、長度和摘要,服務端將 (uploadId, partNumber) 作為冪等鍵;重複且摘要相同就回傳已有結果,摘要不同則拒絕。用戶端用狀態介面找出缺失分片。完成請求帶有序清單與整檔摘要,服務端驗證連續編號、總長度與每片摘要,再呼叫物件儲存 complete;只有組裝成功後才把物件記錄標成 READY。重複完成回傳同一版本,衝突清單不改變狀態。取消與背景過期任務都會 abort 未完成上傳並重試,避免孤兒分片持續計費。所有憑證按租戶和工作階段隔離,建立、分片和完成都執行配額、權限、限流與稽核。」
常見錯誤與改進
- 把上傳做成一個長請求: 使用工作階段和分片,讓網路失敗只影響缺失部分。
- 只記錄已上傳位元組數: 記錄分片編號、摘要與版本,避免重複或亂序覆蓋。
- 完成時直接標記成功: 先完成儲存端組裝並校驗,再發布
READY物件。 - 忽略過期分片成本: 提供取消、背景 abort 和儲存生命週期清理三層保障。
追問及應對
用戶端並發上傳同一分片怎麼辦?
按工作階段和分片編號序列化元資料更新,或使用條件寫入。摘要相同的重複請求回傳冪等成功,摘要不同回傳衝突,用戶端先刷新狀態再重傳。
完成請求逾時,但物件儲存其實已完成怎麼辦?
為完成操作保存冪等鍵與目標版本,重試時先查詢儲存與本地狀態。若已完成且清單一致,回傳同一版本;若狀態不確定,保持 COMPLETING 並由背景協調,不能盲目重新組裝。
如何限制惡意用戶端占滿儲存?
建立工作階段時預留配額,按租戶限制活動工作階段、總分片位元組、並發與過期時長;分片憑證綁定工作階段和範圍,過期工作階段及時 abort,並對異常重試率告警。
是否應該允許覆蓋同名物件?
預設使用新版本或條件寫入。若業務允許覆蓋,要求用戶端提供目標版本或 If-Match 條件,完成後再原子更新引用,避免慢速上傳覆蓋較新的物件。