移动应用程序中的数据同步-多个设备,多个用户


42

我正在考虑构建我的第一个移动应用程序。该应用程序的核心功能之一是多​​个设备/用户将有权访问相同的数据,并且所有设备/用户都将具有CRUD权限。

我认为该体系结构应包含一个存储所有数据的中央服务器。设备将使用API​​与服务器交互以执行其数据操作(例如,添加记录,编辑记录,删除记录)。

我想象一个场景,其中的数据同步将成为一个问题。假定该应用程序在未连接到Internet时应能正常工作,因此无法与此中央服务器通信。所以:

  1. 用户A离线,并编辑记录#100
  2. 用户B离线,并编辑记录#100
  3. 用户C离线,并删除记录#100
  4. 用户C联机(大概记录#100应该在服务器上被删除)
  5. 用户A和B联机,但是他们编辑的记录不再存在

可能出现与上述类似的各种情况。

一般如何处理?我计划使用MySQL,但想知道它是否不适用于此类问题。

Answers:


30

我目前正在开发具有完全相同的要求和问题的移动/桌面/分布式应用程序。

首先,这些要求本身并不是移动应用程序固有的,而是任何断开/分布式的客户端-服务器事务(并行编程,多线程,您就可以了)。因此,它们当然是移动应用程序中要解决的典型问题。

通常,所有这些归结为您拥有一个潜在的数据记录,该记录已分发给n个客户端,这些客户端可以同时对其进行编辑。您需要的是

  1. 适当的版本控制/锁定机制,
  2. 适当的权限/访问管理,
  3. 适当的同步/缓存策略

对于(1),您可以应用一些模式:有两种常用的锁定策略:乐观离线锁定悲观离线锁定。其中一些应用在不同的版本控制“模式”中,例如MultiVersion并发控制(MVCC),它对每个数据记录使用一个计数器(很简单的“时间戳”),每当更改记录时都会更新一个计数器。

(2)和(3)本身是非常广泛的问题,需要独立于(1)进行处理。根据我的经验提供的一些建议:

  • 使用客户端服务器技术为您抽象出大多数问题。我强烈推荐一些Web技术,例如CouchDb,它可以通过(乐观)离线锁定+ MVCC处理(1),通过Web API处理(2),以及通过Http缓存很好地处理(3)。

  • 如果可以依靠成熟的技术和方法,请不要自己发明东西。我相信,花任何时间研究和比较现有技术/模式都比尝试实施自己的系统要好得多。

  • 如果可能,尝试使用同类技术。“同质”是指基于相同原理构建的技术,例如Web 2.0使用方案。一个示例:与将SQL用于移动应用程序相比,将适当的CouchDb和REST Client(Web API)与本地缓存策略一起使用是更好的选择。

  • 我强烈建议不要使用MySQL,因为它不是针对此类使用场景的显式技术。它可以工作,但是使用已经包含Web通信和并发样式的数据库系统(例如许多NoSQL数据库),您的处境会好得多。

顺便说一句,我已经与一个针对CouchDb API的自定义本地客户端一起工作,选择了CouchDb,它可以很好地工作和扩展。我从使用MSQL +(N)Hibernate切换到最初因为没有做出正确的选择(意味着没有做足够的研究)而付出了高昂的代价。


+1乐观锁定与悲观锁定是我读OP帖子的第一件事

10

首先,您提到了API和数据库(MySQL)。我非常建议您使用API​​,并且不要尝试在数据库之间直接进行通信。后一条路线根本无法很好地扩展。

您应该考虑的一个很好的起点是使用Apache CouchDB。它是无模式的,基于HTTP和JSON,并且具有很好的复制机制。我们用它来解决类似的问题。

CouchDB的复制机制使用与任何其他客户端相同的HTTP API。因此,实质上,它通过API提供复制。

对于iOS,我建议使用Couchbase Lite项目。它非常适合同步数据。对于Android,制造上述Couchbase Lite项目的同一家公司正在开发类似的产品-Couchbase Lite for Android。它不如iOS版本完整,还需要完成一些工作。

但是,CouchDB需要考虑一些事项。

  1. 您将需要提供自己的冲突解决方案。幸运的是,如果发生冲突,则CouchDB会将冲突的版本和选择保留为任意版本,但是将确定性冲突作为主要版本。因此,您可以考虑延迟初始版本的冲突解决。
  2. 复制机制是用于复制数据库的,而不是同步的。因此,如果您有很多已删除的文档,则从服务器到客户端的复制将花费越来越长的时间。有一种方法可以避免使用“数据库轮换”。这实际上删除了旧的删除。
  3. 您无法控制复制顺序。但是,您可以提出一些聪明的解决方案来提高复制性能,例如使用过滤的复制先获取一些文档,甚至直接按需访问服务器。
  4. 复制不会在iOS的后台进行。您可以利用iOS SDK提供一些后台复制的情况。

最后,如果您不想使用CouchDB,则至少可以将其用作如何使用HTTP API制作同步算法的良好参考。我的建议是从CouchDB开始,然后,如果您需要更多自定义内容,则考虑自己滚动。


我对该API的计划是使用CodeIgniter实现RESTful API,该API将与所需的任何数据库解决方案进行交互。我没有考虑使用具有内置API的数据库系统。我的计划不同意您的回答吗?
ProgrammerNewbie

另外,我现在正在研究CouchDB。我是否仅使用CouchDB构建应用程序?还是我仍将像MySQL这样的东西与CouchDB结合使用?例如,应用程序仍然对RDBMS有一些基本需求。我是否要在MySQL中对这种数据建模,然后将需要同步的数据放入CouchDB中?
ProgrammerNewbie

请指定您的“ RDBMS需求”。CouchDb不提供什么?CouchDb是一个NoSQL数据库,因此您不需要其他MySQL。最重要的是,由于您可以使用JavaScript拦截API调用并使用视图构建输出,因此CouchDb可以使您无需中间层就能走很长一段路。
塞巴斯蒂安

@ProgrammerNewbie,听起来您的计划总体来说不错:从数据库中提取一个API。CouchDB可以做到这一点,但是您并不是完全从CouchDB这个事实中抽象出来的。关于第二个问题,我也不知道为什么也需要RDBMS。CouchDB提供了map / reduce视图,以提供对数据,过滤器,变更跟踪等的查询。
David V

@Sebastian-我只是不熟悉NoSQL,所以我想知道我是否仍需要RDBMS来存储我的关系数据。
ProgrammerNewbie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.