在两个不同的系统之间同步对象,最好的方法?

时间:2009-03-11 22:50:04

标签: iphone ruby-on-rails client-server data-synchronization

我正在使用基于XML的有效负载在iPhone和网站之间同步两个业务对象,并且愿意为最佳例程征求一些想法。

这个问题的本质是相当通用的,我可以看到它适用于需要在Web实体和客户端(桌面,移动电话等)之间同步业务对象的各种不同系统。

可以双方编辑,删除和更新业务对象。双方都可以在本地存储对象,但同步仅在iPhone端启动,以便断开连接查看。所有对象都有一个updated_at和created_at时间戳,并且两边都有一个RDBMS支持(iPhone端的SQLite和网络上的MySQL ......再次我认为这不重要)并且手机确实记录了最后一次尝试同步。否则,不存储其他数据(此刻)。

您将使用什么算法来最小化系统之间的网络聊天以进行同步?如果“软删除”不是一个选项,你将如何处理删除?你会添加哪些数据模型来改善这种情况?

2 个答案:

答案 0 :(得分:11)

最简单的方法:同步时,传输所有记录where updated_at >= @last_sync_at。向下:这种方法根本不能容忍时钟偏差。

保持每次更新行时增加的版本号列(以便时钟偏差不会影响您的同步过程)和最后同步的版本号(以便可能存在相互冲突的更改)可能更安全标识)。为了提高带宽效率,请在发送到每个复制对等体的最后一个版本的每个数据库中保留一个缓存,以便只需要传输已修改的行。如果这将是一个星型拓扑,叶子可以使用简化的模式,其中最后一个同步版本存储在每个表中。

为了支持删除的同步,需要某种形式的软删除,但是这可以是“逻辑删除”记录的形式,其仅包含已删除行的键。只有在您确定所有副本都已处理过它们之后,才能安全删除逻辑删除,否则一个分散的副本可能会重新生成您认为已删除的记录。

答案 1 :(得分:0)

所以我总结一下,你的问题与断开的同步有关。

所以这就是我认为应该发生的事情:

初始同步您可以检索数据以及与之关联的任何信息(行版本,文件校验和等)。重要的是你存储这些信息并保持原始状态直到下一次成功同步。应对此数据的COPY进行更改。

跟踪更改如果您正在处理数据库行,我们的想法是,您基本上必须跟踪插入,更新和删除操作。如果你正在处理像xml这样的文本文件,那么它会稍微复杂一些。如果多个用户可能同时编辑此文件,那么您必须拥有差异工具,因此可以在更精细的级别(而不是整个文件)中检测到冲突。

检查冲突如果您只处理数据库行,则很容易检测到冲突。每当更新行时,你可以有另一列递增(我认为mssql内置不确定mysql)。因此,如果您拥有的副本的数量与服务器上的副本数量不同,那么您就会发生冲突。对于文件或字符串,校验和将完成工作。我想你也可以使用修改日期,但要确保你有一个非常精确和准确的测量,以防止未命中。例如:假设我检索一个文件,并在检索到文件后立即保存。可以说时差是1毫秒。然后我对文件进行了更改,然后我尝试保存它。如果记录的最后修改时间仅精确到10毫秒,则我检索的文件很可能与您保存的文件具有相同的修改日期,因此程序认为没有冲突并覆盖您的更改。所以我一般不会使用这种方法只是为了安全起见。另一方面,稍微修改后校验和/哈希冲突的可能性几乎为零。

解决冲突现在这是棘手的部分。如果这是一个自动过程,那么您必须评估情况并决定是否要覆盖更改,丢失更改或再次从服务器检索数据并尝试重做更改。幸运的是,似乎会有人际互动。但编码仍然带来很多痛苦。如果要处理数据库行,则可以检查每个列,并将其与服务器中的数据进行比较,并将其显示给用户。我们的想法是以非常精细的方式向用户呈现冲突,以免压倒他们。大多数冲突在许多不同的地方存在非常小的差异,因此一次向用户呈现一个小差异。所以对于文本文件来说,它几乎相同,但更复杂一百倍。所以基本上你必须创建或使用差异工具(文本比较是一个完全不同的主题,并且在这里太广泛了),它可以让你知道文件中的小变化以及它们在类似于数据库:插入,删除或编辑文本的位置。然后以相同的方式向用户呈现。所以基本上对于每个小冲突,用户必须选择是否放弃他们的更改,覆盖服务器中的更改或在发送到服务器之前执行手动编辑。

因此,如果你做得对,那么应该给用户一个冲突列表(如果有的话)。这些冲突应该足够精细,以便用户快速决定。因此,例如,冲突是拼写的变化,用户更容易从单词拼写中进行选择,而不是向用户提供整段并告诉他有变化,他们必须决定做什么然后,用户必须寻找这种小错误拼写。

其他注意事项:数据验证 - 请记住,您必须在解决冲突后执行验证,因为数据可能已更改文本比较 - 就像我说的,这是一个很大的主题。谷歌吧!断开同步 - 我认为那里有一些文章。

来源:https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers