我正在开发一个应用程序,它将通过我控制的服务器在用户之间同步数据。目前,我正在记录每个设备上的UTC更改时间,这有助于确定哪些数据是最新的-服务器上的数据还是设备上的数据。
我可以相信iPhone和iPad协调世界时是准确的吗?如果没有,我如何标记更新,使我仍然可以检测来自不同用户的更新并检测可能的更新冲突?
发布于 2011-11-20 10:03:11
出于您的目的,最好使用像http://en.wikipedia.org/wiki/Lamport_timestamps这样的逻辑时钟
发布于 2011-11-20 09:52:21
你绝对不能相信iOS设备的时钟是正确的。用户可以随心所欲地设置它们,而不必与时间服务器同步。
进行同步时,您可以通过获取设备当前时间的视图来开始该过程。如果这与服务器的当前时间视图不同,那么您可以将此偏移量应用于正在上载的更改的时间戳,以将它们带入“服务器时间”。显然,这假设设备时钟在进行更改的时间段内没有更改-也就是说,它忽略了某些更改具有正确时间的可能性,而另一些更改则需要应用偏移量。
最安全的选择是跟踪这个偏移量,看看它是否会在同步冲突中产生任何不同。在任何可能会产生影响的情况下,应用偏移量,但在任何不会影响被视为最新数据的情况下,使用设备中未修改的时间戳-因此,如果用户回想起他们执行某项操作时的时间是“3:00 if”,他们仍然会看到带有3:00 if的事件时间戳如果使用任何偏移量计算,不要忘记确保任何项目都不应该在时间上相对于服务器向前移动到声称它在未来发生的点。:)
发布于 2011-11-20 10:52:29
在分布式系统中,核心算法不依赖于时间在多台机器上的准确性。
最大的问题(特别是像偶尔连接的设备)是,它们可能会长时间断开连接,并进行许多更改。我们在这里讨论的不是漂移,我们讨论的是在设备上没有可靠时间的情况下,可能在很长一段时间内没有连接到服务器的许多编辑。
如果你想要在一个不重要的系统(facebook app,而不是金融应用)中交错操作的近似值,服务器可以在每次更改时保持一个不断增加的changeId --一种应用的更改日志。然后,当设备更改实体时,它会记录该实体并引用它所知道的最后一个changeId。将该实体修订写回服务器将导致记录新的changeId,但实体修订保留由设备写入时的changeId (确定其在实体写入历史记录中的交错位置)和新的服务器changeId (当其他客户端获得自changedId x以来的所有修订时使用)。
然后,设备可以检索自它所知道的上一次changedId以来的所有更改,并将获得所有实体-它可以在查看实体时根据它在写入时所知道的changeId来排序修订。
这意味着连接更一致的设备将在写入(交错)上赢得更多,而偶尔连接的设备将更频繁地丢失。但是,所有的修订都将被写入-只有最新的胜利。您可以在字段或实体级别执行此操作。如果在字段级别,不同用户的字段更改将毫不费力地合并-如果这是您想要的。
它是分布式修订的近似交错,它只是根据您与服务器的最后一条消息进行交错。
https://stackoverflow.com/questions/8198833
复制相似问题