算法 请教云端同步的实现

zlx_star · 2012年07月08日 · 最后由 zlx_star 回复于 2012年07月10日 · 3742 次阅读

请教类似于 chrome 和 dropbox 的同步功能是如何实现的? 比如说假定 A 和 B 是两个客户端, C 是云端。当 A 和 C 要同步时,如何决定是 A 覆盖 C 还是 C 覆盖 A ?

其实和版本控制软件的原理很相似通过 hash 来判断文件是否存在,如果不存在则上传或者下载,当两个客户端同步时会有冲突处理与分支合并。

#1 楼 @bony 假如说我 A 客户端有文件增加,那同步时,它是如何决定是 C 删除了这个文件还是 A 增加了这个文件?

#2 楼 @zlx_star 服务器会保存一个文件列表,客户端会监控你的操作,比如说你往那个同步文件夹里添加了一个文件,他就会比对是否是存在的,如果存在再去校验 hash,看文件是否变化了,如果没变化就不操作。否则就上传。
同理删除也是,你删除一个文件,服务器也就会删除。
A 客户端上传文件,服务器收到文件以后会校验 C 是否有这个文件,如果没就下载。
C 删除一个文件,服务器就会校验 A 是否有这个文件,如果有也就删除。
不会出现你说的那个情况。

#3 楼 @bony 你说的很具体很详细。但我还是云里雾里的。你能就题目中的情况帮我分析分析吗?非常感谢。注意有可能是 A 增加了文件,也可能是 C 删除了文件。

#4 楼 @zlx_star 这不是一个谁覆盖谁的问题,仅仅是同步。
云端永远是接受操作的一方,你在客户端操作文件,所做的操作会反馈到云端,云端会执行同样的操作。
现在假设 AC 都是空的,然后 A 中你添加了两个文件,这时客户端程序会得到这两个文件的名称与 hash,然后发送给服务器,判断是否存在这两个文件,如果没有就上传。
删除同理。
现在大多数的文件同步都是这样做的,还有一种就是基于版本控制的文件同步,和 Git 很像。

匿名 #6 2012年07月09日

同一时刻只有一个客户端操作应该不管其他,就是接受这些改动 我觉得难点在同事多个客户端改动的时候,怎么处理同步和冲突

#5 楼 @bony 我了解了,谢谢。

#6 楼 @yggg 我只是一个很简单的需求,并不会出现多个客户端同时的情况

需要 登录 后方可回复, 如果你还没有账号请 注册新账号