类似Evernote多客户端与服务器同步数据的最佳方案?

发布于 2022-08-25 11:45:07 字数 299 浏览 14 评论 0

这里说的同步是:
手机App内有一个sqlite的数据库,以便他离线时可以增加一些数据,例如拍的照片以及写的文字等.
当联网时,自动把离线时写的东西提交给服务器
同时,如果用其他客户端改变的旧内容或删除了旧文章,那么在App里也做出对应的修改和删除,保证本地App与服务器始终是一模一样的

目前采取的方案是按最后修改时间来做处理,如果ID相同的项目,始终以修改时间最新的那个作为标准,
如果App本地数据库出现有服务器不存在的项目,那么就把本地的删除.

可有其他更优的方案实现类似Evernote的多客户端同步?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

想你的星星会说话 2022-09-01 11:45:07

要判断谁是【最新版本】并不容易。在网络上,你不能保证时钟是同步的。
目前我改成所有更新到服务器的数据,都用服务器时间来更新时间戳,然后将该时间返回给客户端,客户端修改自己数据的时间跟服务器上一样

南街女流氓 2022-09-01 11:45:07

删除的逻辑有问题

如果本地创建了新项目,服务器是肯定没有的,而本地的就被删除了。

当一个项目被删除时,数据库内仍然应该留有【ID=xx被删除】的删除记录;只要没有这个删除记录,就是新增的记录。若干天后可以清理老的删除记录;天数取决于你认为多长时间所有客户端都会同步一次。

多个客户端在离线状态下改变了同一个文件可能造成冲突

Dropbox的处理方法是复制出一个conflict copy文件。
我还是偏好覆盖为最新版本,并在服务器保留历史版本若干天。

不过,要判断谁是【最新版本】并不容易。在网络上,你不能保证时钟是同步的。时区的问题容易解决,使用UTC就行。即使如此,UTC绝对时间也无法保证精确。

野侃 2022-09-01 11:45:07

自己没有动手试过,但是也许可以试一下类似Git的同步方式?commit和update分离。
服务器端记录所有的更新/提交信息,客户端记录从上一次的同步时间(如果有的话)后最终的修改记录(添加/删除应该是一样的),然后客户端把修改记录发给服务器(同一账户的多客户端可以通过消息队列的方式排队进行更新),当然,只有最后一个commit后发送更新请求的客户端能获得全部更新

当然,遗留问题就是指向同一个文件的不同修改造成的冲突的问题,没想好该怎么处理……要不和git一样提醒用户自己手动解决?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文