跳转到内容

40. Desktop Sync Client 桌面同步客户端

你想做一个工具,监控某个文件夹里的文件变化,随时知道什么被改了。

  • 监控本地文件夹的文件变化
  • 显示变更列表(新增/修改/删除)
  • 基本的文件信息展示
用Electron实现一个文件变更监控工具:
功能:
1. 启动时选择要监控的文件夹
2. 用fs.watch(或chokidar库)监控文件变化
3. 变更事件类型:add(新增) / change(修改) / unlink(删除)
4. 变更列表界面:
- 时间 | 类型 | 文件路径 | 文件大小
- 新增=绿色,修改=黄色,删除=红色
5. 过滤器:忽略.git, node_modules, .DS_Store等
6. 统计信息:监控文件总数、今日变更次数
7. 变更历史存本地JSON文件(最近1000条)
Electron结构:
- main.js:主进程,处理文件系统操作
- renderer.js:渲染进程,显示UI
- preload.js:安全桥接
技术:Electron, Node.js, chokidar, HTML+CSS+JS
  • 选择文件夹后开始监控
  • 新增文件显示绿色条目
  • 修改文件显示黄色条目
  • 删除文件显示红色条目
  • 过滤规则生效(忽略.git等)
  • 历史记录持久化到JSON文件
  • 重启应用后历史仍在
  • 文件系统监控(fs.watch/chokidar)→ Module: Node.js文件系统
  • Electron主进程/渲染进程架构 → Module: Electron基础
  • 文件事件处理 → Module: 事件驱动

想把本地文件的变更自动上传到服务器,实现简单的备份。

  • 变更文件上传到服务器
  • 文件哈希对比避免重复传输
  • 单向同步(本地→服务器)
在V1基础上实现单向上传同步:
Go后端:
1. 文件存储API:
- POST /api/files/upload — 上传文件(multipart)
- GET /api/files/list — 文件列表(path, hash, size, updated_at)
- DELETE /api/files/delete?path=xxx — 删除文件
- GET /api/files/hash?path=xxx — 获取服务端文件哈希
2. 文件存储在服务器本地目录
3. SQLite记录文件元数据(path, hash, size, uploaded_at)
Electron客户端改进:
1. 文件变更检测到后:
- 计算文件MD5哈希
- 与服务端哈希比对
- 哈希不同 → 上传文件
- 哈希相同 → 跳过(已同步)
2. 删除事件 → 通知服务端删除
3. 同步状态显示:
- 每个文件旁边显示同步图标(已同步✓/同步中.../待同步○)
- 底部状态栏:同步进度(3/10文件已同步)
4. 同步队列:变更文件排队上传,避免并发过多
5. 重试机制:上传失败自动重试3次
配置:
1. 服务器地址配置
2. 同步文件夹路径配置
3. 忽略规则配置(.gitignore格式)
技术:Electron, Go+Gin, SQLite, MD5哈希
  • 文件变更自动触发上传
  • 哈希相同的文件跳过上传
  • 服务端正确接收和存储文件
  • 删除同步正常
  • 同步状态图标正确显示
  • 上传失败自动重试
  • 忽略规则生效
  • 文件哈希对比 → Module: 数据完整性
  • HTTP文件上传 → Module: 网络编程
  • 同步队列管理 → Module: 任务调度
  • 重试策略 → Module: 容错设计

不仅本地改动要同步到服务器,服务器上的改动也要同步回本地。

  • 双向同步(本地↔服务器)
  • 冲突检测和标记
  • 文件元数据管理
在V2基础上实现双向同步:
PostgreSQL存文件元数据:
1. 表:files(id, user_id, path, hash, size, version, updated_at, deleted)
2. 表:sync_states(id, user_id, device_id, path, local_hash, remote_hash, last_sync_at)
双向同步流程:
1. 客户端定时(每30秒)发起同步请求
2. 上传阶段:
- 客户端发送本地变更列表(path, hash, updated_at)
- 服务端比对,接受更新或标记冲突
3. 下载阶段:
- 服务端返回客户端缺少的变更
- 客户端下载并应用
4. 同步API:
- POST /api/sync/check — 发送本地文件清单,返回需要上传/下载的列表
- POST /api/sync/upload — 上传文件
- GET /api/sync/download?path=xxx — 下载文件
冲突检测:
1. 冲突条件:本地和服务端都有修改(hash都变了且不同)
2. 冲突处理:
- 两个版本都保留(file.txt → file.txt, file.conflict.txt)
- 客户端弹窗提示用户选择
3. 冲突日志记录
Electron改进:
1. 同步面板:显示同步状态、最近同步时间
2. 冲突列表:显示冲突文件,点击查看两个版本
3. 同步日志:详细的操作记录
技术:Electron, Go+Gin, PostgreSQL, React(Electron渲染层)
  • 本地变更同步到服务器
  • 服务器变更同步到本地
  • 同时修改同一文件触发冲突
  • 冲突文件两个版本都保留
  • 冲突提示弹窗显示
  • 同步日志记录完整
  • 删除操作双向同步
  • 双向同步算法 → Module: 同步系统
  • 冲突检测策略 → Module: 分布式一致性
  • 文件版本管理 → Module: 版本控制
  • 同步状态机 → Module: 状态管理

大文件频繁修改,每次传整个文件太浪费带宽,需要只传变化的部分。

  • 文件分块和块级哈希
  • 只传输变化的块(rsync思想)
  • 带宽优化
在V3基础上实现增量传输:
文件分块:
1. 将文件按固定大小分块(默认4MB)
2. 每个块计算MD5哈希
3. 文件指纹 = 所有块哈希的列表
4. 存储:block_index表(file_id, block_index, hash, size)
增量对比(rsync思想简化版):
1. 客户端计算本地文件的块哈希列表
2. 发送给服务端
3. 服务端比对每个块:
- 哈希相同 → 跳过
- 哈希不同 → 标记需要传输
- 新增块 → 需要传输
4. 返回需要传输的块索引
5. 客户端只上传变化的块
6. 服务端用已有块+新块重组文件
API:
1. POST /api/sync/prepare — 发送块哈希列表,返回需上传的块索引
2. POST /api/sync/upload-block — 上传单个块(block_index + data)
3. POST /api/sync/commit — 所有块上传完毕,服务端重组文件
带宽优化:
1. 传输压缩(gzip)
2. 并行上传(最多3个块同时上传)
3. 带宽监控:显示上传/下载速度
4. 限速配置:避免占满带宽
Electron改进:
1. 传输进度条:显示块级进度(5/20块已传输)
2. 传输速度显示
3. 节省的带宽统计(跳过的块大小)
技术:Electron, Go+Gin, PostgreSQL, 文件分块, gzip压缩
  • 文件正确分块,哈希计算准确
  • 只传输变化的块
  • 服务端正确重组文件
  • 大文件增量传输带宽明显减少
  • 并行上传正常工作
  • 传输进度准确显示
  • gzip压缩生效
  • 文件分块与哈希 → Module: 数据完整性
  • rsync增量同步算法 → Module: 同步算法
  • 并行上传 → Module: 并发编程
  • 传输压缩 → Module: 网络优化

用户有多台设备(办公电脑+家里电脑+笔记本),文件要在所有设备间同步。

  • 设备注册和管理
  • 变更事件实时广播
  • 选择性同步
在V4基础上实现多设备同步:
设备管理:
1. 设备注册:
- 首次连接时生成device_id
- 记录设备名称、操作系统、最后在线时间
2. 设备列表API:
- GET /api/devices — 我的所有设备
- DELETE /api/devices/:id — 移除设备(清除该设备同步状态)
3. 设备在线状态(WebSocket心跳)
变更广播:
1. 文件变更时,服务端通过WebSocket通知其他在线设备
2. 消息格式:{type: "file_changed", path, hash, updated_at, source_device}
3. 收到通知的设备立即触发该文件的同步
4. 离线设备上线后全量对比一次
选择性同步:
1. 设备级配置:选择要同步的文件夹
2. 未选择的文件夹不下载到本地
3. 但在文件浏览器中显示(灰色图标)
4. 点击可触发按需下载
5. 磁盘空间不足时提示用户取消部分文件夹
设备间传输优化:
1. 同一局域网的设备直接P2P传输(速度更快)
2. 局域网发现:UDP广播发现同一网络的设备
3. P2P传输失败回退到服务器中转
Electron改进:
1. 设备管理页面
2. 选择性同步配置界面
3. 局域网设备发现状态显示
技术:Electron, Go+Gin, PostgreSQL, WebSocket, UDP广播
  • 设备注册和列表显示正确
  • 文件变更实时通知其他设备
  • 离线设备上线后补全同步
  • 选择性同步只下载选中文件夹
  • 按需下载功能正常
  • 局域网P2P传输生效
  • P2P失败回退到服务器
  • 设备注册与管理 → Module: 多端系统
  • WebSocket事件广播 → Module: 实时通信
  • 选择性同步策略 → Module: 同步设计
  • P2P局域网发现 → Module: P2P网络

V6 — 10万+用户:团队同步与版本回滚

Section titled “V6 — 10万+用户:团队同步与版本回滚”

团队共享文件夹,需要权限控制、版本历史和离线支持。

  • 共享文件夹与权限控制
  • 文件版本历史和回滚
  • 离线操作队列
在V5基础上实现团队同步:
共享文件夹:
1. 创建共享文件夹,邀请团队成员
2. 权限模型:
- owner:完全控制(读写+管理成员+删除)
- editor:读写
- viewer:只读
3. 成员管理:邀请/移除/修改权限
4. 共享文件夹独立于个人文件夹
权限控制:
1. 文件级权限继承:默认继承文件夹权限
2. 可对单个文件设置特殊权限
3. 权限检查:上传/下载/删除前验证
4. 操作审计日志(谁在什么时间操作了什么文件)
版本历史:
1. 每次文件变更保存历史版本
2. PostgreSQL存版本元数据,块存储保留历史块
3. 版本列表:显示每个版本的时间、修改者、大小
4. 版本预览:查看历史版本内容
5. 版本回滚:恢复到指定版本
6. 版本保留策略:最近30天所有版本 + 之前每月保留1个
离线队列:
1. 离线时操作记录到本地队列
2. 队列项:{operation, path, data, timestamp}
3. 上线后按顺序回放队列
4. 回放冲突处理(离线期间他人修改了同一文件)
5. 队列持久化(IndexedDB),断电不丢失
存储优化:
1. 去重:相同内容的块只存一份(content-addressable storage)
2. 冷热分离:最近文件在SSD,历史版本在HDD/S3
3. 存储配额:每个用户/团队配额限制
4. 配额告警:接近限额时通知
技术:Electron, Go微服务, PostgreSQL, Redis, 块存储, WebSocket
  • 共享文件夹创建和邀请正常
  • 权限控制生效(viewer不能写)
  • 操作审计日志完整
  • 版本历史正确记录
  • 版本回滚文件内容正确
  • 离线队列正确记录操作
  • 上线后队列回放正确
  • 内容去重减少存储空间
  • 存储配额限制生效
  • RBAC权限模型 → Module: 权限系统
  • 版本控制(快照+增量)→ Module: 版本管理
  • 离线队列与冲突回放 → Module: 离线优先
  • Content-Addressable Storage → Module: 存储系统