我打算使用local.us的localStorage适配器来允许它同步/获取本地存储而不是通过jqXHR。这样我的应用就可以离线工作了。
然而,一旦我的应用程序重新上线,我会进行ajax调用以将本地数据集与服务器同步,或者构建某种“重放”系统以仅发送更改。
但是,当数据集发生分歧(在服务器和客户端都发生了变化)时,我将如何处理?哪个来源有正确的数据集?
答案 0 :(得分:10)
您应该能够通过执行以下操作来创建简单的双向同步协议:
在所有应该同步的表上,都有一个“上次更新”的时间戳字段,每当你修改一行时都会更新(包括插入和删除,请参阅下面的内容)。
对于“id”,请避免自动递增整数(这需要与服务器通信以找出下一个值),而是使用GUID。 localStorage适配器默认执行此操作。使用GUID,服务器和客户端都可以生成新行而无需相互通信。
您需要使用“软删除”。除了实际删除行之外,还有一个标记为已删除的标记,并在您需要列出对象集合时对此标记进行过滤。这样,即使删除也会正确传播。您可以为在一段时间内保持删除的所有行执行“内务管理”(实际上删除行),其中该时间需要大于最大可能的“离线”时间,以确保删除已传播。
存储您上次与客户端上的服务器同步的本地时间戳。确保使用适当的时区在服务器和客户端上存储时间戳非常重要。
当您从客户端同步服务器时,请将其发送给您“最后同步”时间戳,服务器应该向您发送自那时以来发生更改的所有内容。使用服务器提供的新时间戳,将其作为新的“上次同步时间”存储在客户端本地。根据GUID更新/插入收到的任何行(如果您在本地拥有它们则更新,如果没有,则更新)。
如果您有本地存储的更改,请从客户端到服务器的原始时间戳之后发送所有本地修改的行,最好在从服务器读取更新之前(您也可以在之后执行此操作,但无论如何,您应该检查更新的时间戳以确定哪个更新更新,并根据您选择的任何冲突解决策略处理它,如果不重要则不处理。)
当您意识到实际的跨平台本地存储使用时,您会感到痛苦,目前您的数据限制在大约2.5兆字节。希望很快就能改变。在您决定使用IndexedDB来解决这些限制之前,API还没有稳定下来,并且大多数实现都是半成品且不兼容。
答案 1 :(得分:1)
如果只是确保您的数据在上次编辑时有一些标记呢?然后你可以比较,如果服务器更新,则覆盖客户端,反之亦然。