在移动应用程序和网络服务器之间同步大量数据

Sync large amounts of data between mobile app and webserver

设置

我有本机 iOS 和 Android 应用程序,它们可以与我的网络服务器同步数据。应用程序的要求是它们可以离线工作,因此数据存储在 sqlite 数据库中的应用程序上。

应用程序通过一系列 REST 调用与服务器通信,这些调用从服务器发送 JSON 供应用程序存储在它们的数据库中。

我的问题

这个数据规模非常大,有些表可以有百万条记录,phone数据库的最终大小可以接近100mb。

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

所以我正在寻找提高这个过程效率的方法。

我的想法

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

应用程序会下载此快照,但仍然必须调用它们的 REST 方法,以防快照发生后发生变化。

问题

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

这是一个复杂的问题,因为答案应取决于您的限制条件:

  1. 数据多久更改一次?如果太频繁,那么快照将很快过时,因此应用程序将有效地大量更新数据。此外,对于大量数据,应用程序将在同步上浪费 CPU 时间(即使用户没有主动使用所有这些数据!),或者可能会很快与服务器不同步 - 这尤其如此iOS 与 Android 应用程序相比,应用程序具有非常有限的后台功能(只有很小的 window,受到限制)。

  2. 那个数据库是只读的吗?您正在向服务器发送更新吗?如果是这样,那么您需要准备冲突解决技术和覆盖案例,其中数据被修改,但不会立即发布到服务器。

  3. 您需要支持数据库方案更改时的情况。实际上,在您的方法中,您需要为不同版本的应用程序准备好多个(初始)数据库。

你的想法很好,以防没有对数据库进行太多更新并且常规下载方式效率不高(这就是你通常描述的:通过多个 REST 调用发送数百万条记录非常痛苦) .

但是,谨防撞墙:如果数据变化很大,并且您被迫每天在每台设备上更新 tens/hundreds 数千条记录,那么您可能需要考虑一个完全不同的方法:一种可能要求您的应用程序仅支持部分离线模式(对于大多数 recent/important 项目)或数据模型的混合方法(因此在用户想要编辑某些内容时对最新数据执行实时请求)。

100mb 不算大。此时我的应用程序已经同步了许多 GB。如果您的数据可以静态生成和更新,那么您可以做的一件事就是将所有内容写入服务器(json、图像等...),然后将所有内容同步到您的本地文件系统。就我而言,我使用 S3。在 select 时间或当用户想要时,他们同步并且只有 pulls/updates 发生了变化。 AWS 实际上在 local/remote 文件夹或存储桶上有一个名为 sync 的 API 调用。一个电话。我做我的自定义,但本质上是一样的,检查本地的最后更新日期和文件大小,如果不同,则将其添加到下载队列中。