【问题标题】:Can I Rely on the iOS Device Clock Being Correct?我可以依靠 iOS 设备时钟正确吗?
【发布时间】:2011-11-20 01:49:28
【问题描述】:

我正在开发一个应用程序,该应用程序将通过我控制的服务器在用户之间同步数据。目前,我正在记录每台设备上更改的 UTC 时间,这有助于确定哪些数据是最新的——服务器上的数据还是设备上的数据。

我可以相信 iPhone 和 iPad UTC 时间是准确的吗?如果没有,我还能如何标记更新,仍然可以让我检测来自不同用户的更新并检测可能的更新冲突?

【问题讨论】:

  • 我建议在应用程序启动以及关闭并再次启动时使用 NSTimeInterval。比较一下,如果符合你指定的时间限制,从服务器下载数据
  • 这实际上是我的设计原则——分布式系统中的算法永远不要依赖时间。仅将时间用作数据。

标签: ios


【解决方案1】:

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

进行同步时,您可以通过获取设备的当前时间视图来开始该过程。如果这与服务器对当前时间的看法不同,那么您可以将此偏移量应用于正在上传的更改的时间戳,以将它们带到“服务器时间”。显然,这假设设备时钟在进行更改的期间没有更改 - 也就是说,它忽略了一些更改具有正确时间的可能性,而另一些则需要应用偏移量。

最安全的选择是跟踪这个偏移量,看看它是否会对同步冲突产生任何影响。在任何会产生影响的情况下,应用偏移量,但在不会影响被视为最新数据的任何情况下,请使用设备中未修改的时间戳——所以如果用户回忆起它是“3: 00pm”当他们做某事时,他们仍然会看到那个带有 3:00pm 时间戳的事件。如果使用任何偏移量计算,请不要忘记确保任何项目都不应该在时间上相对于服务器向前移动到声称它在未来发生的点。 :)

【讨论】:

    【解决方案2】:

    为了您的目的,最好使用像http://en.wikipedia.org/wiki/Lamport_timestamps这样的逻辑时钟

    【讨论】:

      【解决方案3】:

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

      最大的问题(尤其是偶尔连接的设备)是它们可能会长时间断开连接并进行许多更改。我们在这里不是在谈论漂移,我们可能在谈论长时间没有连接到服务器而设备上没有可靠时间的许多编辑。

      如果您希望在一个不重要的系统(facebook 应用程序,不是财务)中交错操作的近似值,则服务器可以在每次更改时保持一个不断增加的 changeId long - 有点像应用的更改日志。然后,当设备更改实体时,它会记录它并引用它知道的最后一个 changeId。将该实体修订写回服务器将导致记录新的changeId,但实体修订在设备写入时维护changeId(决定了它在实体写入历史中交错的位置)和新的服务器changeId(当其他客户端获得自 changedId x 以来的所有修订时使用。

      然后设备可以检索自它知道的最后一个 changedId 以来的所有更改,并将获取所有实体 - 它可以在查看实体时根据它在编写时知道的 changeId 对修订进行排序。

      这意味着连接更稳定的设备将在写入(交错)时赢得更多,而偶尔连接的设备将更频繁地丢失。但是,所有修订都将被写入 - 只是最新的胜利。您可以在字段或实体级别执行此操作。如果在字段级别,不同用户的字段更改将毫不费力地合并 - 如果这是您想要的。

      这是分布式修订的近似交错,它只是根据您与服务器的最后一条消息进行交错。

      【讨论】:

        猜你喜欢
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 2014-09-27
        • 2016-01-10
        • 2018-04-30
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        相关资源
        最近更新 更多