【问题标题】:Client-Server Data Synchronisation Algorithm客户端-服务器数据同步算法
【发布时间】:2015-10-22 13:27:51
【问题描述】:

客户端数据库 - CoreData (iOS)
服务器数据库 - MySQL

我正在尝试实现客户端和服务器之间的数据同步,但复杂的部分是架构是高度相关的。我正在经历几种已经在使用的同步模式,看起来它们中的大多数都是基于 NOSQL 或无模式数据库的。想知道对于高度相关的数据是否有任何同步模式。我已经使用过 couchbase、dropbox sync api、wasabi synch 等。以下是关注点

1) 高度相关的数据意味着,有几个相互关联的表,并且创建/更新发生在所有表上。现在我计划为每个表做单独的 CRUD 请求。这是一个好方法吗?但问题是请求应该有严格的排序,因为在收到 table-2 数据之前无法处理 table-3 中的更改。这种关系很难同步。

2) 客户端上的更改跟踪。识别特定表(CoreData 实体)中更改的最佳方法是什么。我正在计划一种增量方法,一次只上传类似对象的更改。有任何见解/链接吗?

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

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

问题 #1 解释

假设有 10 个表,API 公开这 10 个表的 CRUD 请求。 1 请求将只做任何一张表的 C/R/U/D。所以我的问题是,在离线数据同步方面,这是设计此类 API 的一种好方法。例如考虑一个关系数据

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

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

【问题讨论】:

  • 您的服务器 API 是什么样的?还是那还没有设计?
  • @TomHarrington 服务器在 Heroku 上运行,API 是在 nodejs 中设计的
  • 我实际上是指 API 调用是什么样的,而不是它们构建的框架。听起来您担心尝试在客户端应用程序中复制 MySQL 需求,这很不寻常。

标签: ios core-data client-server rdbms data-synchronization


【解决方案1】:

您似乎不知道典型的relational DBMS facilities and protocols

支持多个会话同时写入访问,使其适用于多用户、高并发和 OLTP 应用程序。

1) 访问 MySQL 的 API 允许您通过事务以原子方式(全部或全部)进行更改。在该事务中,您应该同时更新尽可能多的表,但可以根据需要对这些更改进行排序。通过在使用表时锁定表,然后以相反的顺序解锁,可以避免死锁。您可以请求仅锁定事务知道它可能更改的部分表,以便非重叠客户端可以同时进行。

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

3) 您可以使用显式的客户端串行事务 id,以便客户端加 id 指示客户端认为其事务被发送的顺序,而不管其时钟。

I wonder how much you have googled.

【讨论】:

  • 感谢您的回复。我已经用更多细节编辑了我的问题。 #1 - 请参考问题 1 的解释。我的问题是这种方法对任何其他选择是否有效或开放。 #2 - 这仅与 iOS CoreData 有关,因为应在客户端上跟踪更改。
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多