您必须决定的第一件事是关于在发生冲突的变化时哪一方被视为“权威”的一般政策。
即:假设记录 #125 于 1 月 5 日晚上 10 点在服务器上更改,并且同一记录于 1 月 5 日晚上 11 点在其中一部电话(我们称之为客户端 A)上更改。
上次同步是在 1 月 3 日。然后用户会在 1 月 8 日重新连接。
确定需要更改的内容是“容易”的,因为客户端和服务器都知道上次同步的日期,所以任何事情创建或更新(有关更多信息,请参阅下文),因为需要协调最后一次同步。
因此,假设唯一更改的记录是#125。
您要么决定两个版本中的一个自动“胜出”并覆盖另一个,要么您需要支持协调阶段,用户可以在其中决定哪个版本(服务器或客户端)是正确的版本,从而覆盖另一个。
这个决定非常重要,您必须权衡客户的“角色”。特别是如果不仅在客户端和服务器之间存在潜在冲突,而且不同的客户端可以更改相同的记录。
[假设 #125 可以由第二个客户端(客户端 B)修改,尚未同步的客户端 B 有可能提供同一记录的另一个版本,从而使之前的冲突解决方案变得毫无意义]
关于“创建或更新“上面的一点...如果记录源自其中一个客户端,您如何正确识别该记录(假设这在您的问题域中有意义)?
假设您的应用程序管理业务联系人列表。如果客户端 A 说您必须添加一个新创建的 John Smith,并且服务器上有一个客户端 D 昨天创建的 John Smith...您是否会创建两条记录,因为您无法确定它们不是不同的人?您是否也会要求用户解决此冲突?
客户是否拥有数据子集的“所有权”? IE。如果客户 B 被设置为区域 #5 数据的“权威”,客户 A 是否可以修改/创建区域 #5 的记录? (这将使一些冲突的解决变得更容易,但对于您的情况可能不可行)。
总结起来主要问题是:
- 考虑到分离的客户端在创建新记录之前可能尚未访问服务器,如何定义“身份”。
- 之前的情况,无论解决方案多么复杂,都可能导致数据重复,因此您必须预见如何定期解决这些问题以及如何通知客户他们认为的“Record #675”实际上已被合并/取代记录 #543
- 决定是否通过以下方式解决冲突fiat(例如,“如果自上次同步以来服务器版本已更新,则服务器版本始终胜过客户端版本”)或通过手动干预
- 的情况下fiat,特别是如果您决定客户端优先,您还必须注意如何处理其他尚未同步的客户端,这些客户端可能会有更多更改。
- 前面的项目没有考虑数据的粒度(为了使描述更简单)。可以说,不像在我的示例中那样在“记录”级别进行推理,您可能会发现在字段级别记录更改更合适。或者一次处理一组记录(例如人员记录+地址记录+联系人记录),将它们的聚合视为一种“元记录”。
参考书目:
当然,更多关于这个维基百科 http://en.wikipedia.org/wiki/Data_synchronization.
一个简单的同步算法 https://unterwaditzer.net/2016/sync-algorithm.html作者:虚拟目录同步器 https://vdirsyncer.readthedocs.org/en/stable/index.html
关于数据同步的 OBJC 文章 http://www.objc.io/issue-10/data-synchronization.html
SyncML®:同步和管理您的移动数据 http://my.safaribooksonline.com/0130093696(在 O'Reilly Safari 上预订)
无冲突的复制数据类型 http://hal.inria.fr/docs/00/61/73/41/PDF/RR-7687.pdf
乐观复制 http://pagesperso-systeme.lip6.fr/Marc.Shapiro/papers/Optimistic_Replication_Computing_Surveys_2005-03_cameraready.pdfYasushi Saito(惠普实验室)和 MARC SHAPIRO(微软研究院)-ACM 计算调查,卷。 V,第 N,3 期,2005 年。
亚历山大·特劳德、于尔根·纳格勒-伊莱因、弗兰克·卡尔格尔和迈克尔·韦伯。 2008。通过重用 SyncML 实现循环数据同步。第九届国际移动数据管理会议 (MDM '08) 的会议记录。 IEEE 计算机协会,美国华盛顿特区,165-172。 DOI=10.1109/MDM.2008.10http://dx.doi.org/10.1109/MDM.2008.10 http://dx.doi.org/10.1109/MDM.2008.10
Lam, F.、Lam, N. 和 Wong, R. 2002。移动 XML 数据的高效同步。第十一届信息和知识管理国际会议论文集(美国弗吉尼亚州麦克莱恩,2002 年 11 月 4 日至 9 日)。 CIKM '02。 ACM,纽约,纽约,153-160。数字编号=http://doi.acm.org/10.1145/584792.584820 http://doi.acm.org/10.1145/584792.584820
Cunha, P. R. 和 Maibaum, T. S. 1981。《资源》抽象数据类型+同步-面向消息编程的方法-。第五届国际软件工程会议论文集(美国加利福尼亚州圣地亚哥,1981 年 3 月 9 日至 12 日)。国际软件工程会议。 IEEE 出版社,新泽西州皮斯卡塔韦,263-272。
(后三张来自ACM数字图书馆,不知道你是否是会员,或者是否可以通过其他渠道获取)。
来自Dr.Dobbs http://www.ddj.com site:
- 使用 SQL Server CE 和 SQL RDA 创建应用程序 作者:Bill Wagner 2004 年 5 月 19 日(为桌面和移动 PC 设计应用程序的最佳实践 - Windows/.NET)
来自 arxiv.org:
-
无冲突的复制 JSON 数据类型 http://arxiv.org/abs/1608.03960- 论文描述了 JSON CRDT 实现(无冲突复制数据类型 - CRDT - 是支持并发修改并保证此类并发更新收敛的数据结构系列)。