跳转到内容

场景 28:文件同步 (Dropbox)

从浏览器里的文件管理器,演进到支持多设备同步的云存储系统。


V1 — 1 个用户:纯前端文件管理

Section titled “V1 — 1 个用户:纯前端文件管理”

你想在浏览器里管理文件,支持拖拽上传,文件存在本地浏览器中。

  • 拖拽文件到浏览器区域上传
  • 文件存储到 IndexedDB(支持大文件)
  • 文件列表展示:名称、大小、类型、修改时间
  • 基本操作:下载、删除、重命名

用 React + Tailwind 构建浏览器文件管理器。实现拖拽区域(onDragOver/onDrop)接收文件,用 IndexedDB 存储文件的 ArrayBuffer 和元信息(名称、大小、类型、时间)。文件列表展示所有文件,支持按名称/大小/时间排序。操作:点击下载(创建 Blob URL),删除(确认弹窗),重命名。显示已用存储空间。不需要后端。

  • 拖拽文件到浏览器成功存储
  • 文件列表正确显示元信息
  • 下载的文件与上传的一致
  • 删除和重命名正常工作
  • 刷新页面文件不丢失
  • IndexedDB 存储二进制数据 → Module 1
  • 拖拽 API(Drag and Drop)→ Module 1
  • Blob 和 ArrayBuffer 操作 → Module 2

V2 — 10 个用户:服务端文件存储

Section titled “V2 — 10 个用户:服务端文件存储”

文件需要在服务端持久化,多人可以上传下载,需要目录结构。

  • 文件上传下载 API(multipart/form-data)
  • 本地文件系统存储,数据库存元信息
  • 目录结构:创建文件夹、移动文件
  • SQLite 存储文件树

用 Go + Gin + GORM + SQLite 构建文件存储后端。模型:File(名称、路径、大小、MIME类型、哈希SHA256、所有者、父目录ID、是否为目录、创建/更新时间)。文件存本地 ./storage/ 目录,以 SHA256 哈希命名(去重)。API:上传文件(POST multipart)、下载文件(GET 返回文件流)、创建目录、文件列表(指定目录)、移动文件、删除文件。前端实现文件树导航。

  • 文件上传后可以下载,内容一致
  • 目录结构正确嵌套
  • 相同文件上传两次不会重复存储
  • 文件可以在目录间移动
  • 删除文件后存储空间释放
  • multipart 文件上传 → Module 3
  • 内容寻址存储(SHA256 去重)→ Module 4
  • 树形结构的数据库表示 → Module 4

用户的文件很多,每次全量上传太慢,需要只同步变化的部分。

  • 迁移到 PostgreSQL
  • 文件哈希比对:客户端计算哈希,服务端比较决定是否需要上传
  • 同步状态追踪:每个文件的同步状态(synced/modified/conflict)
  • 同步日志:记录所有同步操作

迁移到 PostgreSQL。实现增量同步协议:客户端发送文件清单(路径+SHA256 哈希+修改时间),服务端比对后返回三个列表——需要上传(本地新增或修改)、需要下载(服务端新增或修改)、需要删除(服务端已删除)。添加 SyncLog 表记录每次同步(操作类型、文件路径、时间、结果)。文件表添加 sync_version 字段,每次修改递增。同步 API:POST /api/sync/check 比对,POST /api/sync/upload 上传变化文件,GET /api/sync/download/:id 下载变化文件。

  • 未修改的文件不会重复上传
  • 修改文件后只上传变化的文件
  • 服务端新增文件能同步到客户端
  • 同步日志记录所有操作
  • sync_version 正确递增
  • 增量同步协议设计 → Module 5
  • 哈希比对检测变化 → Module 6
  • 同步版本向量 → Module 5

V4 — 1000 个用户:分块上传与断点续传

Section titled “V4 — 1000 个用户:分块上传与断点续传”

用户上传大文件(GB 级),网络不稳定时需要断点续传,相似文件需要去重。

  • 大文件分块:固定大小切块,并行上传
  • 断点续传:记录已上传的块,中断后从断点继续
  • CDC(Content-Defined Chunking):基于内容的变长分块,跨文件去重
  • 上传进度显示

实现分块上传系统。客户端将文件按 4MB 切块,每块计算 SHA256。上传前发送文件元信息和所有块哈希到 POST /api/upload/init,服务端返回需要上传的块列表(已存在的块跳过)。每块通过 PUT /api/upload/chunk/:uploadId/:index 上传,支持并行(最多 4 个并发)。所有块上传完成后 POST /api/upload/complete 合并。UploadSession 表跟踪上传状态。实现简单 CDC:用 Rabin 指纹做变长分块(最小 2MB,最大 8MB,平均 4MB),相同内容的块只存一份。前端显示总进度和每块进度。

  • 大文件正确分块上传和合并
  • 中断后重新上传从断点继续
  • 相同内容的块只存储一份
  • 并行上传提升速度
  • 进度条准确显示
  • 分块上传协议 → Module 7
  • 断点续传状态管理 → Module 7
  • Content-Defined Chunking → Module 8

V5 — 1 万用户:多设备实时同步

Section titled “V5 — 1 万用户:多设备实时同步”

一个用户有多台设备,在一台设备修改文件后,其他设备需要实时收到变更。

  • 设备注册和管理
  • 文件变更事件通过 WebSocket 推送
  • 冲突检测:两台设备同时修改同一文件
  • 冲突解决策略(保留两个版本 / 合并 / 选择一个)

实现多设备同步。Device 模型(用户ID、设备名、设备指纹、最后同步时间)。设备连接 WebSocket /ws/sync 后,收到该用户其他设备的文件变更事件(created/modified/deleted + 文件路径 + 版本号)。冲突检测:如果设备上传的文件 base_version 不等于服务端当前版本,标记为冲突。冲突处理:服务端保留两个版本(原文件和冲突副本,命名为”文件名(设备名的冲突副本).扩展名”),通知用户手动解决。设备管理 API:列表、重命名、注销设备。

  • 设备 A 修改文件后设备 B 实时收到通知
  • 两台设备同时修改检测到冲突
  • 冲突文件保留两个版本
  • 设备列表正确显示
  • 设备注销后不再收到同步事件
  • 设备同步协议 → Module 9
  • 冲突检测与解决策略 → Module 9
  • WebSocket 事件推送 → Module 7

V6 — 10 万+ 用户:团队空间与企业管理

Section titled “V6 — 10 万+ 用户:团队空间与企业管理”

企业团队需要共享文件夹、精细权限、存储配额管理。

  • 共享文件夹:邀请成员,设置权限(查看/编辑/管理)
  • 权限继承:子文件夹继承父文件夹权限
  • 存储配额:用户/团队存储限额和用量统计
  • 管理后台:用户管理、存储报表、操作审计

实现团队文件空间。Team 模型(名称、拥有者、存储配额)、TeamMember(团队、用户、角色:admin/editor/viewer)、ShareLink(文件/文件夹、权限、过期时间、密码可选)。共享文件夹权限检查:递归向上查找最近的权限设置,子目录继承父目录权限。存储配额:用户默认 5GB、团队默认 100GB,上传前检查是否超额。管理后台 API:用户列表+存储用量、团队存储报表、操作审计日志(谁在何时对什么文件做了什么操作)。支持回收站(软删除,30天自动清除)。

  • 共享文件夹成员可按权限访问
  • 子文件夹继承父文件夹权限
  • 超出配额时上传被拒绝
  • 管理后台显示存储用量报表
  • 回收站支持恢复和自动清除
  • 权限继承模型 → Module 10
  • 配额管理系统 → Module 11
  • 软删除与回收站 → Module 6
  • 审计日志设计 → Module 11