1
loading 2020-03-15 20:19:51 +08:00 via Android
每条数据都加时间,如果有重叠,就用最新的时间。
你只能相信时间(手机的时间基本是准的),其他设备你自己分析。 |
2
cmdOptionKana 2020-03-15 20:20:41 +08:00
必然会遇到有冲突的时候,就看遇到冲突时怎么优雅地处理了。
|
4
refresh OP @cmdOptionKana 有办法不冲突吗,如果冲突,可能就只有提醒用户选择如何覆盖了,但我希望这个过程是完全自动的
|
5
cmdOptionKana 2020-03-15 20:27:53 +08:00
|
6
aricxu 2020-03-15 20:30:32 +08:00
版本控制,类似 svn,git 那样搞
|
7
Kilerd 2020-03-16 00:03:37 +08:00 1
CRDT 算法了解一下。
如果是文本的话,还可以考虑用 ot 和 easysync 算法 |
8
Tink 2020-03-16 00:07:56 +08:00 via iPhone
冲突的时候复制副本,让用户选
|
9
luckyrayyy 2020-03-16 02:40:40 +08:00
都改一个地方怎么可能不冲突?除非预设冲突解决方案,比如一切以最新的为准。
|
10
Mithril 2020-03-16 09:29:28 +08:00
要么像 SVN 一样,编辑以前连一下服务器加锁。
要么像 Git 一样,想办法自己解决冲突。 虽然有各种自动合并的算法,但终究是会有冲突的。出现冲突只能让用户解决,没有别的办法。 |
11
passerbytiny 2020-03-16 09:43:25 +08:00
多方同时更改一个东西,必然冲突;冲突必然需要手动处理:这两个基本原则你是永远无法违反的,不管离线还是在线(在线的时候可以加锁从而避免同时更改一个东西,但如果锁处理的不好照样冲突)。
这里面唯一的漏洞是:一份数据并不总是一个整体,它可以拆分成多个数据块。这样虽然表面看起来是多方共同更改一份数据,但实际上是各自更改各自的专有数据,从而可以协同工作。 所以你可以试者对数据做分配,让不同的客户端修改不同区域的数据。然而协同工作这种事,单个或者几十个程序员就不要自己搞了,老老实实买吧。光文件同步这一个东西,微软就做了好多年、买了几家小公司、砍了无数半成品,才做出 SkyDrive。 |
12
refresh OP @luckyrayyy 如何判断哪个数据是新的?客户端和服务器端的时间可能不一致,如果多端同时修改的话,无法判断。
@Tink 嗯,如果没有办法,只能用这个了 @Mithril 操作的时候,可能是离线的 @passerbytiny 我的这个协同工作主要是操作数据库,并不是文件操作。可以认为一个用户的数据有无数行,在离线的时候,任何用户都可能修改其中的一条数据(包括 update 和 insert,delete 不做物理删除,所以也是 update ),当连线的时候,如何确保一致性。 |
13
passerbytiny 2020-03-16 11:07:53 +08:00
@refresh #10 不要搞了。关系数据库同步别说离线同步了,就是在线同步,也没人敢干。
|