Client-Server数据同步算法



Client DB - CoreData (iOS)

我试图实现客户端和服务器之间的数据同步,但复杂的部分是模式是高度相关的。我浏览了几个已经在使用的同步模式,看起来它们大多数都是基于NOSQL或无模式数据库的。想知道对于高度关联的数据是否有任何同步模式。我已经用过了couchbase, dropbox sync api,芥末同步等。以下是关注的问题

1)高关系数据是指有几个相互关联的表,并且创建/更新发生在所有表上。现在我计划为每个表做单独的CRUD请求。这是一个好方法吗?但问题是,应该对请求进行严格的排序,因为在接收到表2数据之前,不能处理表3中的更改。这种关系使得同步变得困难。

2)改变客户端的跟踪。识别特定表(CoreData Entity)中的更改的最佳方法是什么。我正在计划一个delta方法,其中只有在类似的对象的变化将被上传在一个时间。有什么见解/链接吗?

3)数据合并/冲突解决-我无意中发现了这一部分。一种方法是在每个对象中修改时间戳,但如果设备日期不同步或手动更改怎么办?

我想知道这种与RDBMS支持的服务器或任何替代方法的同步模式的含义/挑战。

问题1解释

假设有10个表,api为这10个表公开CRUD请求。请求将只对任意一个表进行C/R/U/D操作。我的问题是,当涉及到离线数据同步时,这是设计这样的api的好方法吗?例如,考虑一个关系数据

组织->员工->部门->项目

假设这4个表中的一些对象是离线创建的。现在我们需要在网络恢复时将数据同步到服务器。所以它就像首先创建/更新组织,一旦它结束,创建/更新员工,这样它就可以链接到组织。所以基本上每次C/U/D都会从顶层到底层对象发出。所以我的问题是在同步问题中这是否是一个好方法。因为如果数据不是关系型的,我们可以在单个C/U/D API调用中上传所有表中的更改。

您似乎没有意识到典型的关系DBMS设施和协议

支持多个会话同时写访问,适合多用户、高并发和OLTP应用。

1)你访问MySQL的API允许你通过事务自动地(全部或没有)做你的更改。在该事务中,您应该同时更新尽可能多的表,但可以根据需要对这些更改进行排序。通过在使用表时锁定表,然后按相反的顺序解锁,可以避免死锁。您可以请求只锁定事务知道可能更改的部分表,以便不重叠的客户端可以并发地进行。

2)你的模式可以显式地记录冗余的增量信息,你让DBMS在更新时计算,或者它可以记录足够的过去的变化来计算请求的增量。您的客户端可以向DBMS提供它的事务数据,而DBMS可以根据它和过去返回相关信息。您可能不需要并且应该在客户机上保留任何持久状态。这就是服务器数据库的作用。客户端数据库是它和用户信息的缓冲区。

3)您可以使用显式的客户端串行事务id,这样client + id表示客户端认为其事务发送的顺序,而不考虑其时钟。

我想知道你在谷歌上搜索了多少次。

最新更新