附錄:最小資料結構(Manifest/分塊/狀態)
本附錄針對「平行分塊 + 可續傳 + 冪等重試」提供最小資料結構建議。 目標是在不需要複雜交易的前提下,實現高吞吐量的並行處理,以及失敗後的可靠復原。
一般原則
- 大型物件與小型狀態:分塊/manifest 是儲存於物件儲存的大型物件;狀態則很小,儲存於狀態儲存。
- 唯一鍵與冪等性:分塊 MUST 能以 (transferId, fileId, chunkIndex) 唯一定址,以支援冪等的重傳。
- 可復原性:狀態 MUST 表達「已完成的集合」,讓復原時可以跳過已完成的部分。
- 不洩漏敏感資訊:物件鍵與狀態 SHOULD 避免嵌入電子郵件或原始檔名等敏感欄位(這些是否加密取決於您的隱私政策)。
A.1 Manifest 的最小欄位
Manifest 是接收端下載與重組的「單一入口」。最小建議如下:
- manifestVersion:MUST。用於相容性升級(例如
1)。 - transferId:MUST。唯一的傳輸工作階段識別碼。
- createdAt / expiresAt:SHOULD。用於生命週期處理與介面提示。
- policy:SHOULD。政策摘要(下載次數限制、是否需要密碼、是否允許在上傳完成前分享等)。
- files[]:MUST。檔案清單說明(至少包含檔案大小與分塊範圍)。
- chunking:MUST。包含 chunkSize 以及 chunkCount 的計算方式,或每個檔案的 chunkCount。
- objectKeyRule:MUST。由 (transferId, fileId, chunkIndex) 推導物件鍵,或提供明確的對應表。
A.1.1 files[] 的最小欄位
- fileId:MUST。唯一的檔案識別碼(不要以檔名作為唯一鍵)。
- size:MUST。以位元組為單位的大小。
- mime:MAY。用於顯示與下載建議。
- name:MAY。若要做到嚴格的零知識/最小洩漏,請省略
name,或儲存加密後的名稱。 - chunkCount:MUST。此檔案的分塊數量。
- chunkOffset:MAY。若多個檔案共用全域的
chunkIndex,則需要偏移量;否則可以省略。
A.1.2 完整性與驗證欄位(選用但建議)
- chunkHashes[]:SHOULD。逐塊驗證(雜湊/長度/etag 之一或組合)。
- fileHash:MAY。整個檔案的校驗碼(下載後驗證)。
- ciphertextLength:MAY。密文層級的長度一致性檢查(不需要明文)。
A.2 分塊物件:最小限制
- 唯一定址:分塊 MUST 能以 (transferId, fileId, chunkIndex) 唯一定址。
- 冪等上傳:重複上傳同一個分塊 MUST NOT 破壞最終狀態(可以覆寫或被拒絕,但行為必須一致)。
- 最少中繼資料:伺服器 MAY 僅記錄密文長度、寫入時間、etag/版本等,以利觀測與疑難排解。
A.2.1 物件鍵規則(範例)
/transfers/{transferId}/chunks/{fileId}/{chunkIndex}/transfers/{transferId}/manifest
限制:物件鍵 MUST 支援依 transferId 前綴進行批次清理;物件鍵 SHOULD 避免攜帶敏感的業務資訊。
A.3 狀態記錄:最小欄位
狀態用來回答「上傳/下載進度與復原」。它應該很小,且讀寫快速。
- transferId:MUST。
- status:MUST。建議值:
UPLOADING/READY/DELETED/EXPIRED。 - uploadedSet:MUST。已完成的分塊集合;SHOULD 以位元圖(bitmap)/範圍集合壓縮。
- uploadedBytes:SHOULD。用於進度顯示與配額檢查(可由分塊推算,但另行維護速度更快)。
- downloadCount:MAY。若要強制執行下載次數限制,就必須記錄並以原子方式更新(細節取決於您的儲存方式)。
- expiresAt:SHOULD。用於到期的強制執行與背景清理。
A.3.1 復原 API 的最小輸出
對於可續傳的傳輸,伺服器 SHOULD 能回傳:
- 傳輸狀態(UPLOADING/READY/DELETED/EXPIRED)
- uploadedSet(已完成的分塊集合)
- 政策摘要(例如:超出配額、已過期、是否允許繼續上傳)
注意:與安全與隱私白皮書的分界
- 本附錄只描述傳輸/儲存所需的「結構與限制」。
- 關於加密欄位、金鑰材料如何攜帶/推導,以及驗證失敗時失敗即關閉的行為,請參閱安全與隱私白皮書。