N 个客户端都存在离线写入数据的情况下,如何在同步的时候确定始终最新且不出错?

2020-03-15 20:14:58 +08:00
 refresh
现在有 N 个客户端,都可能会离线操作数据(插入或者更新),当在线的时候向服务器端与服务器同步数据。即将本地服务与服务端数据进行合并,以确保本地和服务器端都是最新的。
2126 次点击
所在节点    问与答
13 条回复
loading
2020-03-15 20:19:51 +08:00
每条数据都加时间,如果有重叠,就用最新的时间。
你只能相信时间(手机的时间基本是准的),其他设备你自己分析。
cmdOptionKana
2020-03-15 20:20:41 +08:00
必然会遇到有冲突的时候,就看遇到冲突时怎么优雅地处理了。
refresh
2020-03-15 20:20:50 +08:00
@loading 时间的方式不太靠谱,因为用户可能会改时间,当然多数的情况下是对的
refresh
2020-03-15 20:21:19 +08:00
@cmdOptionKana 有办法不冲突吗,如果冲突,可能就只有提醒用户选择如何覆盖了,但我希望这个过程是完全自动的
cmdOptionKana
2020-03-15 20:27:53 +08:00
@refresh 不可能,多终端肯定会冲突。除非……

除非要求必须先联网同步,不同步不让编辑。(但这会影响用户体验)
aricxu
2020-03-15 20:30:32 +08:00
版本控制,类似 svn,git 那样搞
Kilerd
2020-03-16 00:03:37 +08:00
CRDT 算法了解一下。
如果是文本的话,还可以考虑用 ot 和 easysync 算法
Tink
2020-03-16 00:07:56 +08:00
冲突的时候复制副本,让用户选
luckyrayyy
2020-03-16 02:40:40 +08:00
都改一个地方怎么可能不冲突?除非预设冲突解决方案,比如一切以最新的为准。
Mithril
2020-03-16 09:29:28 +08:00
要么像 SVN 一样,编辑以前连一下服务器加锁。
要么像 Git 一样,想办法自己解决冲突。
虽然有各种自动合并的算法,但终究是会有冲突的。出现冲突只能让用户解决,没有别的办法。
passerbytiny
2020-03-16 09:43:25 +08:00
多方同时更改一个东西,必然冲突;冲突必然需要手动处理:这两个基本原则你是永远无法违反的,不管离线还是在线(在线的时候可以加锁从而避免同时更改一个东西,但如果锁处理的不好照样冲突)。

这里面唯一的漏洞是:一份数据并不总是一个整体,它可以拆分成多个数据块。这样虽然表面看起来是多方共同更改一份数据,但实际上是各自更改各自的专有数据,从而可以协同工作。

所以你可以试者对数据做分配,让不同的客户端修改不同区域的数据。然而协同工作这种事,单个或者几十个程序员就不要自己搞了,老老实实买吧。光文件同步这一个东西,微软就做了好多年、买了几家小公司、砍了无数半成品,才做出 SkyDrive。
refresh
2020-03-16 10:47:14 +08:00
@luckyrayyy 如何判断哪个数据是新的?客户端和服务器端的时间可能不一致,如果多端同时修改的话,无法判断。
@Tink 嗯,如果没有办法,只能用这个了
@Mithril 操作的时候,可能是离线的
@passerbytiny 我的这个协同工作主要是操作数据库,并不是文件操作。可以认为一个用户的数据有无数行,在离线的时候,任何用户都可能修改其中的一条数据(包括 update 和 insert,delete 不做物理删除,所以也是 update ),当连线的时候,如何确保一致性。
passerbytiny
2020-03-16 11:07:53 +08:00
@refresh #10 不要搞了。关系数据库同步别说离线同步了,就是在线同步,也没人敢干。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/653065

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX