1

我正在研究用户笔记的基本同步算法。我已经弄清楚了大部分,但在我开始编程之前,我想在这里运行它,看看它是否有意义。通常我最终没有意识到一件别人很容易看到而我无法看到的重要事情。以下是它的工作原理:

我的数据库中有一个表,我在其中插入名为SyncOperation. ASyncOperation是一种关于每个设备需要执行以保持最新状态的性质的元数据。假设用户有 2 个注册设备,firstDevice并且secondDevice. firstDevice创建一个新笔记并将其推送到服务器。现在,SyncOperation使用便笺的 Id、操作类型和创建a processedDeviceList。我创建了一个SyncOperation类型为“ e”的NewNot设备,并将原始设备 ID 添加到. 所以现在检查服务器以查看它是否需要进行任何更新。它进行查询以获取所有secondDeviceId 不在. 它发现它的类型是,所以它得到新的注释并将自己添加到. 现在此设备已同步。SyncOperationprocessedDeviceListsecondDeviceSyncOperationsprocessedDeviceListNewNoteprocessedDeviceList

当我删除一个笔记时,我发现已经SyncOperation在表格中创建了类型为“NewNote”的笔记。我将类型更改为删除,删除processedDevicesList除删除笔记的设备之外的所有设备。因此,现在当新设备调用以查看他们需要更新的内容时,由于他们的 deviceId 不在 中processedList,他们将不得不处理该SyncOperation,这会告诉他们的设备删除相应的注释。

这通常是它的工作方式。我的解决方案太复杂了吗?可以简化吗?谁能想到这不起作用的情况?这在大规模上会效率低下吗?

4

3 回答 3

2

听起来很复杂——中央数据库不应该负责确定哪些设备收到了哪些更新。这是我的做法:

  • SyncOperations数据库为每个更改保留一个表。每个SyncOperationis 都有一个change_id按升序编号的编号(即change_id INTEGER PRIMARY KEY AUTOINCREMENT.)
  • 每个设备都有一个current_change_id数字,代表它最后看到的变化。
  • 当设备想要更新时,它会更新SELECT * FROM SyncOperations WHERE change_id > current_change_id。这会得到它需要更新的所有更改的列表。按时间顺序应用它们中的每一个。

这有一个迷人的功能,如果你愿意,你可以简单地通过创建一个新的客户端来初始化一个新设备current_change_id = 0。然后它将拉入所有更新。


请注意,如果两个用户可以同时进行编辑(哪个编辑“获胜”?),这将不会真正起作用。您可以尝试自动合并编辑,也可以向用户发出通知。如果您想要一些灵感,请查看git版本控制系统(或 Mercurial,或 CVS ......)的操作以进行冲突编辑。

于 2012-04-16T05:37:52.280 回答
1

您可能想查看 SyncML,了解如何处理同步操作 (http://www.openmobilealliance.org/tech/affiliates/syncml/syncml_sync_protocol_v11_20020215.pdf)。SyncML 已经存在了一段时间,作为一个公共标准,已经进行了大量的审查和审查。还有一些开源实现(想到了 Funambol)也可以提供一些编码线索。您不必使用整个规范,但阅读它可能会给您一些关于同步数据的“啊哈”时刻 - 我知道它有助于思考需要做什么。

标记

PS 协议的更高版本 - http://www.openmobilealliance.org/technical/release_program/docs/DS/V1_2_1-20070810-A/OMA-TS-DS_Protocol-V1_2_1-20070810-A.pdf

于 2012-04-17T19:13:28.197 回答
0

我已经看到了在其他地方跟踪数据库中的操作的基本想法,所以我敢说它可以工作。您可能希望考虑如果不同的设备同时使用会发生什么,并最终提交相互冲突的更改 - 例如两次不同的尝试编辑同一个笔记。这可能表现为对用户界面的更改,以允许他们手动干预以解决此类冲突。

于 2012-04-16T04:39:27.823 回答