我正在使用基于XML的有效负载在iPhone和网站之间同步两个业务对象,我很想征求一些最佳例程的想法。
这个问题的本质是相当通用的,我可以看到它适用于各种不同的系统,这些系统需要在web实体和客户端(桌面、移动电话等)之间同步业务对象。
业务对象可以在两端进行编辑、删除和更新。两端都可以将对象存储在本地,但同步仅在iPhone端启动,用于断开连接的查看。所有对象都有updated_at和created_at时间戳,并由两端的关系型数据库管理系统支持( iPhone端的SQLite和web端的MySQL……再说一次,我认为这并不重要),而且手机确实记录了最后一次尝试同步的时间。否则,(目前)不会存储任何其他数据。
您将使用什么算法来最小化同步系统之间的网络聊天?如果“软删除”不是一个选项,你将如何处理删除?您会添加哪些数据模型更改来简化此过程?
发布于 2009-03-11 23:01:13
最简单的方法:在同步时,传输所有记录where updated_at >= @last_sync_at。缺点:这种方法根本不能容忍时钟偏差。
更安全的做法是保留一个版本号列,该列在每次更新一行时都会递增(这样时钟偏差就不会影响同步过程)和最后一个同步的版本号(这样就可以识别出潜在的冲突更改)。要使此带宽高效,请在每个数据库中保留发送到每个复制对等方的最新版本的缓存,以便只需要传输修改的行。如果这将是一个星型拓扑,叶子可以使用一个简化的模式,其中最后一个同步版本存储在每个表中。
为了支持删除的同步,需要某种形式的软删除,然而,这可以是只包含被删除行的键的“墓碑”记录的形式。只有在您确定所有副本都已对其进行处理后,才能安全地删除Tombstone,否则,丢失的副本可能会使您认为已被删除的记录复活。
发布于 2012-03-31 12:36:14
因此,我认为总的来说,您的问题与断开连接的同步有关。
下面是我认为应该发生的事情:
初始同步您可以检索数据以及与其关联的任何信息(行版本、文件校验和等)。重要的是,您要存储此信息并将其保留为原始状态,直到下一次成功同步。应对此数据的副本进行更改。
跟踪更改如果您正在处理数据库行,其想法是,您基本上必须跟踪insert、update和delete操作。如果您正在处理像xml这样的文本文件,那么它就稍微复杂一些。如果可能有多个用户同时编辑此文件,则必须使用diff工具,以便可以在更精细的级别(而不是整个文件)检测冲突。
再次检查冲突如果您只处理数据库行,则很容易检测到冲突。您可以有另一个列,它会在行被更新时递增(我认为mssql对mysql有这个内置的不确定)。因此,如果您拥有的副本与服务器上的副本编号不同,则存在冲突。对于文件或字符串,校验和就可以完成这项工作。我想你也可以使用修改日期,但要确保你有一个非常精确和准确的测量,以防止遗漏。例如:假设我检索了一个文件,当我检索到该文件时,您立即将其保存。假设时间差是1毫秒。然后我对文件进行更改,然后尝试保存它。如果记录的上次修改时间仅精确到10毫秒,则我检索的文件很可能与您保存的文件具有相同的修改日期,因此程序认为没有冲突并覆盖您的更改。因此,为了安全起见,我通常不会使用这种方法。另一方面,在较小的修改后校验和/散列冲突的可能性几乎为零。
解决冲突现在这是棘手的部分。如果这是一个自动化的过程,那么您必须评估情况,并决定是要覆盖更改、丢失更改,还是再次从服务器检索数据并尝试重做更改。对你来说幸运的是,似乎会有人类的互动。但它仍然是一个很痛苦的代码。如果您正在处理数据库行,则可以检查每个单独的列,并将其与服务器中的数据进行比较,然后将其显示给用户。这个想法是以一种非常细粒度的方式向用户呈现冲突,以便不会压倒它们。大多数冲突在许多不同的地方都有非常小的差异,所以每次向用户呈现一个小的差异。所以对于文本文件来说,它几乎是一样的,但是要复杂一百倍。因此,基本上你必须创建或使用一个diff工具(文本比较是一个完全不同的主题,在这里不能提及),它可以让你知道文件中的微小变化,以及它们在数据库中的类似方式:文本被插入、删除或编辑的位置。然后以同样的方式呈现给用户。因此,基本上对于每个小冲突,用户必须选择是放弃他们的更改,覆盖服务器中的更改,还是在发送到服务器之前执行手动编辑。
所以,如果你做对了,如果有冲突,应该给用户一个列表。这些冲突应该足够细粒度,以便用户能够快速做出决定。例如,冲突是一种拼写更改,用户从单词拼写中进行选择会更容易,而不是给用户整个段落,然后告诉他有更改,他们必须决定怎么做,然后用户必须寻找这个小的拼写错误。
其他考虑因素:数据验证-请记住,您必须在解决冲突后执行验证,因为数据可能会更改文本比较-就像我说的,这是一个大问题。那就用谷歌搜索吧!断开同步-我认为有几篇文章。
https://stackoverflow.com/questions/636675
复制相似问题