双向同步的冲突解决


24

假设连接并不总是可用的,您如何管理“主”数据库服务器和许多“辅助”服务器之间的双向同步,特别是解决冲突?

例如,我有一个移动应用程序,该应用程序使用CoreData作为iOS上的“数据库”,并且我希望允许用户在没有Internet连接的情况下编辑内容。同时,此信息可在设备将连接到的网站上找到。如果/当两个数据库服务器上的数据发生冲突时,该怎么办?
(尽管我知道CoreData有点不同,但我将其称为DB服务器。)

是否有处理此类问题的一般策略?这些是我可以想到的选项:
1.始终将客户端数据用作更高优先级
2.与服务器端相同
。3.尝试通过标记每个字段的编辑时间戳并进行最新编辑来解决冲突。

尽管我敢肯定,第三个选项会为破坏性的数据破坏打开空间。

我知道CAP定理与此有关,但是我只想最终保持一致,所以不能完全排除它,对吗?

相关问题:双向数据同步的最佳实践模式。对这个问题的第二个回答说,这可能无法完成。


Answers:


14

知道“哪个更改是正确的”的通常解决方案是矢量时钟。本质上,您要跟踪每个保存数据的存储库的计数器,如果特定客户端对其他人的状态的看法与其所连接的对等方的看法不同,则拒绝更改。

您必须回答的主要问题是如何解决被拒绝的保存。这通常意味着某种合并操作。

请注意,矢量时钟使用实时时间戳。同步实时时钟所涉及的问题至少与同步数据一样困难。


1
好的,这就是我想要的
K.Steff

10

这是无法解决的拜占庭将军问题。如果您不能保证在将来的某个时候,您将永远不能保证同步这两个服务器,您将有足够的可靠带宽一次性执行同步。


好的,但是这些家伙如何产生类似的效果:Syncpoint开发
K.Steff 2012年

3
他们只是假设将来某个时候您将拥有足够带宽的可靠连接。
DeadMG 2012年

1

我想这没有标准的方法,每个系统都使用自己的策略来解决冲突。

我使用计算机和电话这两种设备以及Google Spreadsheet进行了一些模拟,以检查Google Docs如何自动处理冲突。这里有一些情况:

情况1

  1. 电脑和电话离线
  2. 具有值“计算机”的计算机编辑单元格和具有值“电话”的电话编辑单元格之后
  3. 电脑上网
  4. 电话变为在线状态,并且计算机和电话均显示“电话”。

情况二

  1. 电脑和电话离线
  2. 具有值“计算机”的计算机编辑单元格和具有值“电话”的电话编辑单元格之后
  3. 手机上网
  4. 计算机变为联机状态,并且计算机和电话均显示“计算机”。

因此,至少Google Docs服务器至少将接收到的最后一个数据用作更高的优先级,而与创建时间(客户端的时间戳)无关。我还测试了它们是否在后台进行同步,显然它们没有同步,因此冲突解决的结果对用户是透明的。

另一方面,GIT不会自动处理冲突,而是委派给试图更改存储库的最后用户,该用户应如何完成合并。

如果可以的话,我只能采用Google Docs方法,并且只能在前台与用户可视化数据同步。否则,用户可能会感到惊讶,当他的电话自动连接到WiFi时,在他的PC上重新编辑后,会议的非同步更改生效。

我会采用客户端时间戳的方法,如果您需要后台同步,则可以覆盖与上次编辑的冲突,如果您需要后台同步,则可以信任客户端时间戳,并且进行不合需要的合并的成本要小于请求用户选择他想要的版本的成本保持。

否则,我将采用GIT方法,方法是在前台的下一个客户端中显示一个弹出窗口,要求用户选择要保留的版本或提供还原合并的机会。


1
我同意,个案研究是解决问题的适当方法。“最佳”方法(git方法)并不总是适用,因为用户可能不想查看/合并更改
K.Steff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.