程序想要支持离线使用?应该怎么实现相关技术? 比如一个最简单的单人记账软件,想要实现云端实时同步,客户端离线时时也可以使用全功能, 我是这样想的,软件使用本地数据库 Sqlite 实现全部功能,每个表都要增加一个时间检验, 因为网页端可能修改数据,客户端离线时也可能修改了数据, 所以每次客户端启动时逐行判断检验字段实现同步数据,(数据量少时可以,数据量大的软件怎么实现呢) 之后客户端正常在线,WebSocket 连接服务器,添加或更新数据后,ws 通知服务端更新? 但是感觉这样实现后不太严谨?请问这种需要应该怎么实现?请教各位 实现, 客户端, 同步, 数据
同步不是问题,如何解决冲突才是问题。没有什么办法可以完美的自动解决冲突。比如你说的办法,如果本地时间不准就可能丢数据。 所以分布式代码管理使用分支,和并请求等等措施,让你手动解决冲突。 OneNote 等笔记也会在有冲突的时候通知你。 最简单的办法,压根就不提供这样的功能。而是在客户端允许用户手动把数据上传更新到服务器,或者手动将数据同步回客户端本地。你不更新就一直用本地数据。 然后在同步的时候提醒用户数据可能有冲突,让他自己选用哪个。只要你在服务器保留每个版本的完整快照,不会让客户丢数据就可以了。 另外记账软件和笔记等等还是不一样的。你可以把它当成一个 Log 收集系统。每条记录都相对独立,而且一旦生成就很少修改,因而也很少产生冲突。你可以将每一次修改都视为创建一条不可变记录,只不过修改时将旧的记录标记为不可用,删除也是如此。 这样就算同步彻底乱套了,你也就只会多数据,而不会丢。
记录一下最后同步时间,注意这里的时间最好是一个逻辑序号,每同步一次在服务端就自增一次。 客户端拿到这个序号以后,在本地的任何操作,具体表现在存储上都关联上这个序号,这样当你下次同步的时候,就可以查询出所有跟这个序号相关联的数据变动,然后把这些数据+序号提交到服务器。 当不同的终端/客户端开始进行同步时,服务端就能够取出这个序号,比较一下当前最后同步序号,这样就能知道不同客户端在同步上的先后顺序。 在技术上有很多种方法来做,上面的序号是一种,还有一种就是写日志,通过快照+重放来实现同步。当然技术只是一方面,如何实现同步的逻辑流程取决于具体的场景,更重要的是你如何处理复杂的边界情况。