类似dropbox、evernote等应是用如何实现数据同步的?

最近在写一个android的记事本应用,想增加一个数据同步的功能,将本地数据上传到服务器,这个很好做,从服务器上下载数据,也很好做,但是同步却远比这个复杂,因为服务器和本地的数据必须经过比较才能知道哪些数据需要相互交换。在网上看到了些网友的回答,记录下来备用。

网友回答一:

对于dropbox,我也只是从使用体验上来说一说,并没有仔细研究。
首先,肯定每一个文件都有版本号,并且版本号可能还有一种算法,这个算法肯定不会是单一要素,如根据时间或者存储的上一个文件之间的对比,因为还要面临离线状态下的文件更新。
再,dropbox为了体验比较快速,当你删除文件的时候其实他是存放在本地的隐藏目录,这样如果你撤消删除的时候,可以很快的恢复,而不需要重新在下载。
再,对于@iammutex 说需要人肉解决冲突,我所知道的是dropbox应该是自动解决的,对于用户是透明的,所以自动解决冲突肯定也要有一个比较全面的方案,这样可以将面临各种终端设备的问题。
最后,dropbox服务器端肯定是存储一份最完整的文件结构和文件列表,而且肯定也会有文件的md5或者hash的方法保证文件的完整性,进行相应的对比,还要有一个机制可以让文件自动的同步,文件的自动同步分为两种,一种是各客户端在打开软件之后进行同步,这个比较容易实现是客户端发起的;另一种是其它客户端更新之后,服务器告之其它同时在线的客户端同时进行更新,我想应该是对客户端加入了一个计划任务隔一段时间主动与服务器端进行联系(如果是服务器主动告之客户端更新,我想难度很大,光客户端ip就是非常难判断的事,所以dropbox的的更新应该不是及时的,而是有延时的)。
以上只是自己思考的dropbox实现的几个难点和猜测他的工作方式。我也很关注这个问题。

网友回答二:

内部协议没研究,不过原理上应该就是做一下diff,把diff结果传到服务器。另一端从服务器获取到这个diff,再将修改施加到自己本地的内容中就行了。
当然,每次diff应该都会有版本号,如果收到的修改版本比当前本地版本更小,那说明有冲突,就需要人肉解决冲突了。

补充一下,人肉解决冲突这个我指的是evernote,对同一个版本,在不同终端进行修改后提交。后提交的终端会接收到带有冲突标识的文档。标识形式和svn冲突后的展示差不多,需要手动合并一下才变成正常文档。如图是我简单的实验结果
屏幕快照 2012-09-29 上午10.53.09.png
dropbox没遇到过冲突,不过据我猜测,dropbox更多的是一种last win的模式,就是按先来后到,最新的版本直接覆盖旧版本。所以说也可以理解为无版本管理的概念。
而从evernote付费版提供的历史版本查询功能来看,evernote是肯定有版本控制,冲突监测在里面的。