2011-11-20 89 views
7

我正在开发一款应用程序,它将通过我控制的服务器在用户之间同步数据。目前,我正在记录每个设备上的UTC更改时间,然后帮助确定哪些数据是最新的 - 服务器上或设备上的数据。我可以依靠iOS设备时钟正确吗?

我可以依靠iPhone和iPad UTC时间是准确的?如果没有,我还可以如何标记更新,这些更新仍然可以让我检测来自各种用户的更新并检测可能的更新冲突?

+1

我会推荐在应用程序启动时以及关闭并重新启动时使用NSTimeInterval。比较它,如果它符合你指定的时间限制,从服务器上下载数据 – CodaFi

+1

这实际上是我的设计原则 - 从不依赖分布式系统中算法的时间。只使用时间作为数据。 – bryanmac

回答

6

绝对不能依赖iOS设备时钟正确。用户可以将它们设置为他们喜欢的任何内容,而不必与时间服务器同步。

在做同步,你可以通过获取的当前时间的设备的视图开始这一进程。如果这与当前时间的服务器视图不同,则可以将此偏移量应用于正在上载的更改的时间戳,以将它们置于“服务器时间”。很显然,这假定器件时钟在更改期间没有改变 - 也就是说,它忽略了一些更改具有正确时间的可能性,有些更改要求应用偏移。

最安全的办法是跟踪这个偏移量,看它是否会做出一个同步冲突的任何差异。在任何情况下,如果它有所作为,请应用偏移量,但在任何情况下,它不会影响最新数据,请使用设备上的未修改时间戳 - 因此,如果用户回想它是“3: 00pm“时,他们仍然会在下午3:00看到该活动时间戳。如果使用任何偏移量计算,不要忘记确保没有任何项目应该相对于服务器及时向前移动,直到它将来声称已经发生。 :)

3

不要依赖于时间是准确的对在分布式系统的核心算法多台机器。

(尤其是像偶尔连接的设备)最大的问题,就是他们可以断开很长一段时间,使许多变化。我们不是在谈论这里的漂移,我们正在谈论潜在的长时间的许多编辑可能没有连接到没有可靠的时间在设备上的服务器。

如果您希望在系统中使用近似交错操作(facebook应用程序,而不是财务),服务器可以随着每次更改而保持不断增加的变化 - 应用更改的日记类型。然后当设备更改一个实体时,它会记录它并引用它所知道的最后一个changeId。将该实体修订版写回服务器将导致一个新的changeId被记录,但实体修订版在设备写入changeId(确定在实体写入历史记录中交织的位置)和新服务器changeId(当其他客户从changeId x获得所有修订时使用)。然后

设备可以检索的所有更改自上次changedId它知道,并会得到所有的实体 - 基于它知道这是写入时对changeId观察实体时,它可以订购的版本。

这意味着连接更一致的装置这就是将赢得更多的写入(交错),并且更偶尔连接会更频繁地输设备。但是,所有的修改都将被编写 - 只是最新的胜利。你可以在现场或实体层面做到这一点。如果在字段级别,不同用户的字段更改会毫不费力地合并 - 如果这是您想要的。

这是一个近似的分布式修订版交错,它只是基于您的最后一条消息与服务器交错。

相关问题