请教类似于 chrome 和 dropbox 的同步功能是如何实现的? 比如说假定 A 和 B 是两个客户端, C 是云端。当 A 和 C 要同步时,如何决定是 A 覆盖 C 还是 C 覆盖 A ?
比如说假定 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 很像。
同一时刻只有一个客户端操作应该不管其他,就是接受这些改动 我觉得难点在同事多个客户端改动的时候,怎么处理同步和冲突
#5 楼 @bony 我了解了,谢谢。
#6 楼 @yggg 我只是一个很简单的需求,并不会出现多个客户端同时的情况