我正在研究一个用户笔记的基本同步算法。我已经解决了大部分问题,但是在我开始编程之前,我想在这里运行它,看看它是否有意义。通常情况下,我最终没有意识到一件别人很容易看到但我做不到的重要事情。
我的数据库中有一个表,在其中插入名为SyncOperation
的对象。SyncOperation
是一种元数据,用于说明每个设备需要执行哪些操作才能保持最新。假设一个用户有两个注册设备,firstDevice
和secondDevice
。firstDevice
创建新便笺并将其推送到服务器。现在,创建一个带有注释id、操作类型和SyncOperation
的processedDeviceList
。我创建了一个类型为“SyncOperation
e”的NewNot
,并将原始设备id添加到SyncOperation
的processedDeviceList
中。所以现在secondDevice
检查服务器,看看是否需要进行任何更新。它进行查询以获取seconddeviceid不在SyncOperations
中的所有processedDeviceList
。它发现它的类型是NewNote
,所以它得到了新的音符并将自己添加到processedDeviceList
。现在该设备已同步。
当我删除一个注释时,我发现已经创建的SyncOperation
在“newnote”类型的表中。我将类型更改为delete,删除processedDevicesList
中的所有设备,删除便笺的设备除外。所以现在,当新设备调用来查看他们需要更新的内容时,因为他们的设备id不在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
创建一个新的客户端来初始化一个新设备。然后它会拉入所有更新。
请注意,如果两个用户可以同时进行编辑(哪个编辑“wins”?),则这不会真正起作用。。您可以尝试自动合并编辑,也可以向用户发出通知。如果您想要一些灵感,请查看git
版本控制系统(或mercurial,或cvs…)的操作,查看是否有冲突的编辑。
关于database - 这是功能同步算法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10168045/