4

这个问题有点笼统,所以为了帮助缩小焦点,我将分享我目前激发这个问题的设置。我有一个运行 RESTful API 的 LAMP Web 服务。我们有两种客户端实现:一种基于浏览器的 javascript 客户端(本地存储存储)和一种基于 iOS 的客户端(核心数据存储)。显然这两个客户端存储数据的方式非常不同,但数据本身需要尽可能多地与远程服务器保持双向同步。

目前,我们的“同步”过程有点愚蠢(例如,非智能)。从概念上讲,它看起来像:

  • 客户端定期向服务器询问所有最新数据。
  • 服务器发送远程数据,这会覆盖客户端存储中的当前本地数据集。
  • 在此之后的任何本地创建/更新/删除都被视为黄金,并立即发送到服务器。

数据本身以相关方式存储,并由客户端用户偶尔更新。在我的具体案例中,客户端并不太关心关系本身(这就是我们现在可以在浏览器客户端中使用本地存储的原因)。

显然这不是真正的同步。我想转移到一个系统,从概念上讲,最近更改的“差异”会定期发送到服务器,服务器会发回它知道的最新更改的“差异”。似乎很难达到这一点,但也许我只是不太了解这个问题。

REST感觉是一个好的开始,但 REST 只讨论两个数据存储相互通信的方式,而不是数据本身如何在它们之间同步。(这个同步过程由每个商店的实现者决定。)实现这个过程的最佳方式是什么?是否有一套现代的编程设计模式适用于为这个问题提供特定的解决方案?如果可能的话,我最感兴趣的是一种通用的(与技术无关的)方法......但是如果存在特定的框架,它们也会很有用。

4

4 回答 4

4

多主复制总是(并且永远是)困难和定制的,因为如何处理冲突将取决于您的应用程序。

IMO 一种更强大的方法是使用主从复制,您的 Web 服务作为主服务器,客户端作为从服务器。要使客户端保持同步,请根据RFC5005使用更改的归档原子源(请参阅事件源)。对于这种类型的复制,这是最接近现代标准的,它是 RESTful 的。

当客户端在线时,他们不会直接更新他们的副本,而是向服务器发送命令并通过 atom 提要更新他们的副本。

当客户离线时,事情变得困难。您的客户需要有一个关于您的 Web 服务行为方式的模型。它将需要您的副本的离线副本,该副本应在写入时从在线副本复制(在线副本是由 atom 提要更新的副本)。当客户端执行修改数据的命令时,它应该存储命令(用于稍后针对 Web 服务重放)、预期结果(用于重放期间的验证)并更新离线副本。

当客户端重新上线时,它应该重播命令,将结果与预期结果进行比较,并通知客户端任何差异。如何处理这些差异将根据您的应用程序而有所不同。然后可以丢弃脱机副本。

于 2013-04-03T01:59:49.707 回答
1

CouchDB 复制通过 HTTP 工作并执行您想要执行的操作。一旦数据库在任一端同步,它将发送添加/更新/删除的差异。

Couch 可以使用其他 Couch 机器或使用 TouchDB 等移动框架来执行此操作。

https://github.com/couchbaselabs/TouchDB-iOS

我已经完成了相当多的工作,但您始终可以在一台机器上设置 CouchDB,在移动设备上设置 TouchDB,然后观察 HTTP 流量来回传输以了解它们是如何做到的。

或阅读: http: //guide.couchdb.org/draft/replication.html

也许上面链接中的某些内容将帮助您了解如何为您的 REST 服务做自己的差异。(因为它们都通过 HTTP 认为它可能很有用。)

于 2013-04-02T22:57:57.400 回答
0

您可能需要查看 Dropbox Datastore API:

https://www.dropbox.com/developers/datastore

听起来它可能非常适合您的目的。他们有 iOS 和 javascript 客户端。

于 2013-09-05T17:49:58.903 回答
0

最近,我对Meteor很感兴趣。

该平台在服务器上设置Mongo,在浏览器中设置 minimongo。客户端订阅了一些数据,当数据发生变化时,平台会自动将新数据发送给客户端。

这是同步问题的一个巧妙解决方案,它也解决了其他几个问题。看看未来是否会有更多平台这样做会很有趣。

于 2016-01-19T19:43:16.800 回答