1

我计划为backbone.us 使用localStorage 适配器,以允许它同步/获取到本地存储,而不是通过jqXHR。这是为了让我的应用程序可以离线工作。

但是,一旦我的应用程序重新上线,我会进行 ajax 调用以将本地数据集与服务器同步,或者构建某种“重播”系统以仅发送更改。

但是,当数据集发生分歧(服务器和客户端都发生变化)时,我将如何处理?哪个来源有正确的数据集?

4

2 回答 2

10

您应该能够通过执行以下操作来创建简单的双向同步协议:

  1. 在所有应该同步的表上,有一个“上次更新”时间戳字段,每当您修改一行时都会更新该字段(包括插入和删除,请参阅下文)。

  2. 对于“id”,避免使用自动递增的整数(这需要与服务器对话才能确定下一个值),而是使用 GUID。localStorage 适配器默认执行此操作。使用 GUID,服务器和客户端都可以生成新行,而无需相互交谈。

  3. 您需要使用“软删除”。与其实际删除一行,不如使用一个标记为已删除的标志,并在需要列出对象集合时过滤此标志。这样,即使删除也能正确传播。您可以对在一定时间内仍被删除的所有行执行“内务处理”(实际上是删除行),其中该时间需要大于最大可能的“离线”时间,以确保删除已经传播。

  4. 存储您上次与客户端上的服务器同步的本地时间戳。确保使用正确的时区在服务器和客户端上存储时间戳很重要。

  5. 当您从客户端与服务器同步时,将您的“上次同步”时间戳发送给它,服务器应该向您发送自那时以来更改的所有内容。使用服务器提供的新时间戳,将其作为新的“上次同步时间”存储在客户端本地。更新/插入根据 GUID 接收到的任何行(如果您在本地有,则更新,如果没有,则插入)。

  6. 如果您有本地存储的更改,请将自原始时间戳以来的所有本地修改的行从您的客户端发送到服务器,最好在从服务器读取更新之前(您也可以在之后执行此操作,但无论如何,您可能应该检查更新的时间戳以计算找出哪个更新更新,并根据您选择的任何冲突解决策略进行处理,如果不重要,则不处理)。

  7. 当您意识到对于实际的跨平台本地存储使用而言,您目前被限制为大约 2.5 兆字节的数据时会感到痛苦。这有望很快改变。在您决定改用 IndexedDB 来解决这些限制之前,API 还没有稳定下来,而且大多数实现都是半途而废且不兼容的。

于 2012-09-10T06:49:33.917 回答
1

如何简单地确保您的数据在上次编辑时有一些标记?然后就可以比较了,如果服务器较新,就覆盖客户端,反之亦然。

于 2012-09-09T17:41:50.427 回答