設計 Google Drive

Hard★★★★Draft

FromSystem Design Interview

Concepts practiced🗄️ 物件儲存 (Object Storage)🧩 一致性雜湊 (Consistent Hashing)🔌 同步 vs 非同步通訊 (Sync vs Async)

Convention: read the requirements & constraints first, sketch your own design, then expand the reference to compare.

📚 From the Books

設計 Google DriveProblemHardStorage & File

檔案儲存與跨裝置同步服務。難點在於強一致性、快速同步與節省頻寬三者的組合——重點放在檔案元資料管理檔案同步兩條流程。

📋 Requirements

🧠 Core Ideas

TIP

核心是「把檔案切成區塊存進物件儲存 + 元資料庫追蹤 檔案/區塊/版本 + 只同步變更區塊 + 通知服務推變更」。

檔案內容存在雲端(S3),元資料庫只存元資料。單機起步後逐步解耦:加負載平衡器、Web/API 伺服器可水平增減、元資料庫做複寫與 sharding(見一致性雜湊概念),檔案改存物件儲存並跨區域複寫。

⚖️ Reference Design

區塊化與 Block 伺服器
  • 檔案切成區塊,每塊有唯一雜湊值、當成獨立物件存進雲端儲存;重建時依序接合。以 Dropbox 為參考,區塊上限 4MB。
  • Block 伺服器負責上傳繁重工作:切塊 → 壓縮(依檔案類型選演算法,如 gzip/bzip2)→ 加密 → 上傳。
  • Delta sync:檔案被改時只傳被修改的區塊,而非整個檔案,藉此省頻寬。
元資料庫與強一致性
  • Schema 含 User、Device、Namespace、File、File_version(唯讀以保版本完整)、Block 等表。
  • 系統要求強一致性:不同用戶端不可同時看到同一檔案不同內容。
  • 快取預設最終一致,須讓快取副本與主節點一致、且寫入 DB 時讓快取失效。選關聯式 DB,因原生支援 ACID。
上傳/下載與通知
  • 上傳(見同步 vs 非同步):新增元資料(狀態 pending)與上傳到雲端儲存兩請求平行;上傳完成回 callback 後改狀態為 uploaded,並通知相關用戶端。
  • 下載:由他處變更觸發;用戶端先拉元資料、再向 block 伺服器下載區塊重建檔案。
  • 通知服務是 pub/sub;選 long polling(單向、通知頻率不高),而非 WebSocket。離線用戶端的變更先存起來,上線再拉取(離線備份佇列)。
同步衝突與節省儲存
  • 衝突解決:先被處理的版本獲勝,後者收到衝突;系統呈現本地與伺服器兩份,讓使用者合併或覆蓋。
  • 省空間三招:區塊去重(雜湊相同即同一塊)、智慧備份策略(設版本數上限、只留有價值的近期版本)、把冷資料移到冷儲存(如 S3 Glacier)。

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading