付録: 最小限のデータ構造 (マニフェスト/チャンク/状態)
この付録では、「並列チャンク + 再開可能な転送 + 冪等な再試行」に関する最小限のデータ構造の推奨事項を提供します。 目標は、複雑なトランザクションを使用せずに、高スループットの同時実行と障害後の信頼性の高いリカバリを可能にすることです。
一般原則
- 大きなオブジェクトと小さな状態: チャンク/マニフェストは、オブジェクト ストレージに保存される大きなオブジェクトです。状態は小さく、状態ストアに格納されます。
- 一意のキーとべき等性: 冪等な再送信のために、チャンクは (transferId、fileId、chunkIndex) によって一意にアドレス指定可能でなければなりません (MUST)。
- Recoverability: リカバリが完了した部分をスキップできるように、状態は「完了したセット」を表現しなければなりません。
- 敏感な漏れはありません: オブジェクトのキーと状態には、電子メールや元のファイル名などの機密フィールドを埋め込むことは避けるべきです (これらが暗号化されるかどうかはプライバシー ポリシーによって異なります)。
A.1 マニフェストの最小限のフィールド
マニフェストは、ダウンロードと再構築のための受信者の「単一のエントリ ポイント」です。最小限の推奨事項:
- manifestVersion:必ず。互換性のアップグレードに使用されます (例:
1). - transferId:必ず。一意の転送セッション識別子。
- 作成日 / 期限切れ: すべきです。ライフサイクル処理と UI ヒント用。
- policy: すべきです。ポリシーの概要 (ダウンロード数の制限、パスワードの要件、完了前の共有が許可されているかどうかなど)。
- ファイル[]:必ず。ファイル リストの説明 (最小ファイル サイズとチャンク範囲)。
- chunking:必ず。 chunkSize と chunkCount の計算方法、またはファイルごとの chunkCount が含まれます。
- objectKeyRule:必ず。 (transferId、fileId、chunkIndex) からオブジェクト キーを取得するか、明示的なマッピング テーブルを提供します。
A.1.1 最小限の files[] フィールド
- fileId:必ず。一意のファイル識別子 (ファイル名を一意のキーとして使用しないでください)。
- size:必ず。バイト単位のサイズ。
- mime:5月。表示とダウンロードの提案用。
- name:5月。厳密なゼロ知識/漏洩を最小限に抑えたい場合は、省略します。
nameまたは暗号化された名前を保存します。 - chunkCount:必ず。このファイルのチャンク数。
- chunkOffset:5月。複数のファイルがグローバルを共有する場合
chunkIndex、オフセットが必要です。それ以外の場合は省略できます。
A.1.2 完全性および検証フィールド (オプションですが推奨)
- チャンクハッシュ[]: すべきです。チャンクごとの検証 (ハッシュ/長さ/etag の 1 つまたは組み合わせ)。
- fileHash:5月。ファイル全体のチェックサム (ダウンロード後に検証)。
- ciphertextLength:5月。暗号文レベルの長さの一貫性チェック (平文は必要ありません)。
A.2 チャンク オブジェクト: 最小限の制約
- 固有のアドレス指定: チャンクは (transferId、fileId、chunkIndex) によって一意にアドレス指定可能でなければなりません。
- 冪等アップロード: 同じチャンクを再アップロードする場合、最終状態を壊してはなりません (上書きまたは拒否される可能性がありますが、動作は一貫していなければなりません)。
- 最小限のメタデータ: サーバーは、可観測性とトラブルシューティングのために、暗号文の長さ、書き込み時間、etag/バージョンなどのみを記録してもよい(MAY)。
A.2.1 オブジェクトキールール(例)
/transfers/{transferId}/chunks/{fileId}/{chunkIndex}/transfers/{transferId}/manifest
制約: オブジェクト キーは、次による一括クリーンアップをサポートしなければなりません。 transferId 接頭語;オブジェクトキーは機密性の高いビジネス情報を持ち込まないようにする必要があります (SHOULD)。
A.3 状態レコード: 最小限のフィールド
州は「アップロード/ダウンロードの進行状況と回復」と回答します。小さくて読み取り/書き込みが速い必要があります。
- transferId:必ず。
- status:必ず。推奨される値:
UPLOADING/READY/DELETED/EXPIRED. - uploadedSet:必ず。完成したチャンクセット。ビットマップ/範囲セットを使用して圧縮する必要があります。
- uploadedBytes: すべきです。進行状況の表示とクォータ チェック用 (チャンクから派生できますが、それを維持する方が高速です)。
- downloadCount:5月。ダウンロード数制限を強制する場合は、それを記録し、アトミックに更新する必要があります (詳細はストレージによって異なります)。
- expiresAt: すべきです。有効期限の強制とバックグラウンドのクリーンアップ用。
A.3.1 リカバリ API の最小限の出力
再開可能な転送の場合、サーバーは以下を返せる必要があります:
- 転送ステータス (アップロード中/準備完了/削除済み/期限切れ)
- uploadedSet (完成したチャンクセット)
- ポリシーの概要 (例: クォータ超過、期限切れ、アップロードの継続が許可されているかどうか)
注: 境界とセキュリティとプライバシーのホワイトペーパーの比較
- この付録では、転送/保存に必要な「構造と制約」のみを説明します。
- 暗号化フィールド、キー素材の伝送/導出方法、認証失敗時のフェールクローズ動作については、セキュリティとプライバシーのホワイトペーパーを参照してください。