基于REST的客户端 – 服务器同步

这个问题是关于我认为是在Android / iOS开发中的一个非常普遍的问题,但我还没有find任何“标准”的解决scheme。

假设我们有一个相当普通的REST API。 服务器数据库包含(除其他之外)具有1:N关系的表格countriestowns

客户端(移动应用程序)想要维护这两个表的本地快照。 因此,当它处于脱机状态时,它可以执行通常通过REST执行的查询,例如:“获取人口> = 100的奥地利城镇名单”?

如何解决这个问题?

第一个问题:一致性。 客户端应该有两张表的快照。 如果客户端下载towns表的更新并下线,某个城镇可能会引用一个不在countries表的本地副本中的countries

第二个问题:客户端应该只下载新的/删除/更改的行。 get_updates_since(...) REST并使用一些自定义RPC调用,比如get_updates_since(...)

第三个问题:如何将客户端的数据库副本(可能离线)的本地更改与服务器同步? 自定义RPC调用?

我不认为有一颗银弹,但你正在寻找的模式是caching。 在过去的项目中,我已经将项目从服务器复制到本地存储(SQLite或平面文件),并根据简单的规则维护关于条目的元数据以更新/上传/清除。 这不是一个简单的问题,最终成为大量的代码。

一致性:在你的例子中,要么确保你首先下载国家表,要么两个操作primefaces – 例如,复制“新”表,并且只有在两个副本完成成功(只有存储)时才replacecaching版本。

只下载新的/删除/更改:是的,这需要客户端/服务器集成 – 时间戳所有logging(格林威治标准时间),要求从服务器的元数据,并通过本地元数据决定做什么。 (在行上提示UUID是有帮助的)。

同步本地更改:是的,更多的客户端/服务器集成。 见上面的段落。

处理所有的exception和边缘情况是具有挑战性的。 看看iCloud sync'ing CoreData的问题 。 也许不是一个公平的比较,因为苹果试图解决这个完全分布式的数据库,但有趣的阅读尽pipe如此。

目前,我正在开展相同的任务 – 构buildAndroid应用程序,使用Azure移动服务将信息与中央SQL数据库同步。 同步策略是支持来自多个客户端的双向同步,以确保数据一致性,而只有增量更改才会被交换。

让我解决你的问题。 我最近写了一篇关于同步algorithm的博客文章来支持这个场景。

由于REST API通信,同步逻辑将在客户端进行pipe理。 参与同步过程的每个表都将具有用于CRUD操作的相应REST Api方法。

对于你的第一个问题(一致性) – 解决scheme是以正确的顺序下载客户端上的数据。 例如,第一个父母,那么孩子要避免参考完整性的问题。 在出现networking问题的情况下,客户端将不得不再次同步以获取其余数据。

第二个问题(只下载增量更改) – 解决scheme是时间戳(正如凯文在下面的答案中所述)。 但是我build议在服务器端使用全局递增的值来避免客户端和服务器之间的时间差异问题。 SQL Server的rowversion是相当不错的select。

第三个问题(客户端的数据集成) – 在客户端表中使用脏标志将有助于区分上传所需的logging。

您可能还需要引入双方的删除标志来处理多个客户端之间的删除。