移动应用和Web服务器之间如何同步大量数据?

13

设置

我有原生的iOS和Android应用程序,它们将数据与我的Web服务器同步。应用程序的要求是可以离线工作,因此数据存储在SQLite数据库中。

这些应用程序通过一系列REST调用与服务器通信,从服务器发送JSON以便应用程序将其存储在其数据库中。

我的问题

这些数据的规模非常大,某些表格可能有一百万条记录,手机数据库的最终大小可能接近100MB。

REST端点必须限制其数据,并且必须多次使用不同的偏移量进行调用,才能实现整个同步。

因此,我正在寻找提高此过程效率的方法。

我的想法

我的一个想法是在服务器上创建一个脚本,该脚本将从服务器的数据库创建SQLite文件,对其进行压缩并将其放置在某个位置供应用程序下载。有效地创建了服务器当前数据的快照。

应用程序将下载此快照,但仍然必须调用其REST方法,以防自快照生成以来发生了任何更改。

问题

这将为我的Web应用程序增加另一层复杂性,我想知道这是否是正确的方法。在同步大量数据时,人们是否使用其他技术?


脚本的想法还不错,但我想知道你们采用了什么样的商业模式?你们展示了哪些类型的信息,需要让应用程序用户始终在线获取信息?你能再多提供一些信息吗?也许你可以在应用客户端中去掉一些无用的列。 - 4gus71n
你的想法听起来很不错。Google Translate 对于离线翻译执行此操作,而 Google Maps 对于离线自定义地图也是如此。HTTP 协议实现了缓存,因此您始终可以检查文件是否已更新。 - Gennadii Saprykin
因此,数据基本上是一个具有坐标的大型通讯录。然后用户访问最靠近他们的房屋。可能地址位于非常偏远的地区,用户在离开之前不必同步Wi-Fi。我认为对于用户来说,仅同步所有数据比用户必须说出他们想要下载哪个部分更简单。 - John Webb
是否在设备上同步整个内容取决于您想要为用户提供什么样的体验。下载所有内容将使您的应用程序更易于使用,但我相信有许多用户不希望您的应用程序占用太多手机空间。通常最好先询问用户,只有在得到他们的同意后才下载这么大的数据块。否则,我会选择在线与部分缓存选项。 - Gennadii Saprykin
2个回答

2
这是一个复杂的问题,答案应该取决于你的限制条件:
1. 数据会经常更改吗?如果更改太频繁,那么快照将很快过时,因此应用程序将有效地频繁更新数据。此外,由于数据量大,应用程序将浪费CPU时间进行同步(即使用户没有积极使用所有这些数据!),或者可能很快与服务器不同步 - 这对于iOS来说尤其如此,因为应用程序的后台功能(仅有小窗口,受到限制)与Android应用程序相比非常有限。
2. 数据库只读吗?您是否向服务器发送更新?如果是这样,那么您需要准备冲突解决技术并涵盖数据被修改但未立即发布到服务器的情况。
3. 您需要支持数据库方案更改的情况。实际上,在您的方法中,您需要准备多个(初始)数据库,以适应应用程序的不同版本。
在数据更新不频繁且常规下载方式效率低下的情况下,您的想法是可行的(这通常是您所描述的:通过多个REST调用发送数百万条记录相当麻烦)。
但是,要注意避免撞墙:如果数据经常更改,并且您被迫每天在每个设备上更新数万/数十万条记录,则可能需要考虑完全不同的方法:一种可能需要您的应用程序仅支持部分离线模式(针对最新/重要项目),或者是数据模型的混合方法(因此在用户想要编辑某些内容时,执行最新数据的实时请求)。

最大的表每周只会有重大变化。虽然每天会发生许多微小的变化,但这可能只会影响不到1000行数据。当导入或删除新的Excel文件时,会发生较大的变化。我正在考虑利用这些时刻来触发快照创建脚本。 - John Webb
每周1000个更改通过REST API完全可以管理。问题是:一旦发生了巨大的差异(导入了Excel),您是否打算在每个设备上从头开始重新获取整个数据库?如果是这样,需要考虑它发生的频率以及数据库文件的大小(所有影响因素:后台下载、不可靠的连接、可能在蜂窝网络上下载及其对用户的影响),并考虑如何从UX角度处理它。 - deekay

0

100mb不算很大。我的应用程序已经同步了许多GB。如果您的数据可以静态生成和更新,那么您可以做的一件事是将所有内容(json、图片等)写入服务器,然后在本地文件系统上同步所有内容。在我的情况下,我使用S3。在选择时间或用户想要时,他们进行同步,并且只拉取/更新已更改的内容。AWS实际上有一个称为同步的API调用本地/远程文件夹或存储桶。一个单一的呼叫。我自定义了我的,但本质上是相同的,检查最后更新日期和本地文件大小,如果不同,将其添加到下载队列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接