我正在研究用户笔记的基本同步算法。我已经弄清楚了其中的大部分内容,但在我开始对其进行编程之前,我想在这里运行它以查看它是否有意义。通常我最终没有意识到一件别人很容易看到而我看不到的非常重要的事情。这是它的工作原理:
我的数据库中有一个表,我在其中插入名为 SyncOperation
的对象。 SyncOperation
是一种关于每台设备需要执行什么才能保持最新状态的元数据。假设用户有 2 个注册设备,firstDevice
和 secondDevice
。 firstDevice
创建一个新笔记并将其推送到服务器。现在,使用笔记的 ID、操作类型和 processedDeviceList
创建了一个 SyncOperation
。我创建了一个类型为“NewNot
e”的 SyncOperation
,并将原始设备 ID 添加到该 SyncOperation
的 processedDeviceList
。所以现在 secondDevice
检查服务器以查看它是否需要进行任何更新。它进行查询以获取所有 SyncOperations
,其中 secondDeviceId 不在 processedDeviceList
中。它发现它的类型是 NewNote
,所以它获取新的笔记并将自己添加到 processedDeviceList
。现在此设备已同步。
当我删除一个笔记时,我在表格中找到了类型为“NewNote”的已经创建的SyncOperation
。我将类型更改为删除,从 processedDevicesList
中删除所有设备,删除注释的设备除外。所以现在当新设备调用以查看他们需要更新的内容时,由于他们的 deviceId 不在 processedList
中,他们将不得不处理 SyncOperation
,这告诉他们设备删除相应的注释。
这通常就是它的工作方式。我的解决方案太复杂了吗?可以简化吗?谁能想到这行不通的情况?大规模使用会不会效率低下?
最佳答案
听起来很复杂——中央数据库不应该负责确定哪些设备收到了哪些更新。以下是我的做法:
- 数据库为每次更改保留一个
SyncOperations
表。每个SyncOperation
都有一个按升序编号的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...)的操作以进行冲突编辑。
关于database - 这是功能同步算法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168045/