我正在实施我的第一个同步代码。在我的情况下,我将为每个用户提供2种类型的iOS客户端,它们将使用lastSyncTimestamp
将记录同步到服务器,这是一个64位整数,表示上一次同步的毫秒时间内的Unix时期。可以随时在服务器或客户端上创建记录,并通过HTTP将记录作为JSON进行交换。
我并不担心冲突,因为很少有更新,并且总是来自同一个用户。但是,我想知道是否有一些我需要注意的常见问题,基于时间戳的方法可能会出错,例如在夏令时期间同步,同步与另一个或其他陷阱发生冲突。
我知道git和其他一些版本控制系统避免与基于内容的协商同步方法的时间戳同步。我可以想象我的应用程序的这种方法,使用对象的uuid
或hash
,两个对等方都宣布它们拥有哪些对象,然后交换它们直到两个对等方具有相同的集合。 / p>
如果有人知道基于内容的同步与基于时间戳的同步的任何优点或缺点,那么这也是有帮助的。
编辑 - 以下是我为时间戳和基于内容的同步提出的一些优点/缺点。请挑战/纠正。
注意 - 我将基于内容的同步定义为两组对象的简单协商,例如如果你给两个孩子交换卡片的两个相同组合的每个部分,他们将如何交换卡片棒球卡片告诉他们,当他们看透他们宣布并交出任何重复时他们发现对方,直到他们都有相同的集合。
基于时间戳的同步的优势
基于时间戳的同步的缺点
基于内容的同步的优势
基于内容的同步的缺点
答案 0 :(得分:7)
部分问题在于时间不是绝对的概念。事物之前或之后发生的事情是一个透视问题,而不是遵守挂钟。
在relativity of simultaneity上阅读一下,了解为什么人们已经停止尝试使用墙上时间来解决这些问题,并使用vector clocks(或至少{{}转移到代表实际因果关系的结构中3}})。
如果您想使用时钟进行同步,逻辑时钟可能最适合您。您将避免所有时钟同步问题和事情。
答案 1 :(得分:2)
我不知道它是否适用于您的环境,但您可能会考虑哪个时间是“正确的”,客户端或服务器(或者甚至是否重要)?如果所有客户端和所有服务器未同步到同一时间源,则在使用客户端的“现在”时间同步到服务器(或从服务器)同步时,客户端可能会有轻微的意外结果。
几年前,我们的开发组织遇到了一些问题。开发人员机器并非都与SCM所在的服务器同步到同一时间源(并且可能未与任何时间源同步,因此开发人员机器时间可能会漂移)。几个月后,开发者机器可能会休息几分钟。我不记得所有的问题,但似乎构建过程试图从一定时间(最后一次构建)以后修改所有文件。自上次构建以来,文件可能已经签入,它具有在上次构建之前发生的修改时间(来自客户端)。
可能是我们的SCM程序不是很好,或者我们的SCM系统或构建过程过于容易受到这个问题的影响。即使在今天,我们所有的开发机器都应该与具有SCM系统的服务器同步时间。
同样,这是在几年前,我不记得细节,但我想提一下它在你的情况下是否重要的可能性。
答案 2 :(得分:0)
您可以查看unison。它是基于文件的,但您可能会发现一些有趣的想法。