Docs 菜单
Docs 主页
/ /
Atlas App Services
/ /

冲突解决方案

在此页面上

  • 概述
  • 冲突解决规则
  • 特殊注意事项
  • 计数器
  • 字符串
  • 自定义冲突解决
  • 总结

当两个或多个用户独立对同一数据进行更改时,将会发生冲突。这可能是由于设备和服务器之间的延迟或连接中断造成的。在此情况下,Atlas Device Sync 自动使用冲突解决策略来合并更改。具体而言,Device Sync 使用操作转换来解决冲突,这是一组保证最终一致性的规则,意味着所有客户端的版本最终都将融合到相同的状态。即使按不同顺序进行更改也是如此。

必须了解规则才能确保结果一致,但好处是,通过遵循这些规则,可以让设备完全离线工作,并且在融合时仍能得出有意义的结果。

从宏观层面来看,规则如下:

始终删除 (delete always wins)。
如果一侧删除了一个对象,即使另一侧稍后对其进行了更改,该对象也将始终保持删除状态。
始终最后更新 (last update wins)。
如果两侧更新相同的属性,Device Sync 将保留最近更新的值。
列表中的插入项按时间排序。
如果两个项目被插入到同一位置,则先插入的项目将排在另一个项目之前。这意味着,如果双方都将项目附加到列表末尾,则将按插入时间的顺序包含这两个项目。
主键指定对象标识。
如果双方都创建具有相同主键的同类对象,则它们将被视为同一对象的实例。

例子

冲突解决示例

Matt 和 Sarah 正在处理他们的遛狗业务数据。Matt 删除了客户的一只狗 Doug 的数据,因为他们不用再遛这只狗了。当 Sarah 外出没有互联网连接时,她会在本地离线版本上编辑 Doug 所需的步行时间数据,因为她不知道 Matt 特删除了 Doug 的数据。

Sarah 恢复互联网连接后,她所做的更改将被发送到服务器。服务器将向她发送 Matt 的删除操作。根据 Device Sync 的冲突解决规则,删除操作始终获胜,因此,将保留 Matt 的删除操作而不是 Sarah 所做的编辑。服务器不会将 Sarah 所做的编辑发送到 Matt 的设备。Matt 和 Sarah 的设备上的数据再次一致。

使用整数进行计数是一种特殊情况。大多数编程语言实施递增操作(如 v += 1)的方式是读取值、递增结果,然后重新存储回原位置。如果有多方同时执行递增(它们可能都读取 10,将其递增到 11,当合并时,将得到结果 11,而不是预期的 12),这显然不起作用。

为了支持这种常见情况,我们提供了一种方法来表达是否递增(或递减)值,并提供足够的提示,以便合并可以达到正确的结果。可以选择更新整个值,也可以按照传达更多含义的方式对其进行编辑,从而能够更精确地控制冲突解决。

Device Sync 将字符串的值解释为一个整体,并且不会基于每个字符合并冲突。例如,这意味着,如果在字符串中插入或删除字符或子字符串,Device Sync 会将其视为字符串整个值的替换项。

一般来说,Device Sync 的冲突解决应该适用于大多数用途,无需进行自定义。也就是说,自定义冲突解决的典型方法是将属性类型从字符串更改为列表。然后,每一方都可以将其更新添加到列表中,并直接在数据模型中应用想要的任何冲突解决规则。可以使用此方法来实施最大值、最小值、最先写入获胜、最后写入获胜或能想到的任何其他类型的解决方案。

  • Device Sync 实施冲突解决系统,允许多个离线写入者同时写入,并且最终仍会融合得出相同的结果。

  • 冲突解决系统遵循四条规则:始终删除、始终最后更新、列表中的插入按时间排序,主键指定对象身份。

  • 计数器和字符串是客户端代码中需要注意的特殊情况。

← 技术细节