设置
我有一个本地iOS和Android应用程序,可与Web服务器之间进行数据同步。应用程序的要求是它们可以脱机工作,因此数据存储在sqlite数据库中的应用程序上。
应用程序通过一系列REST调用与服务器通信,这些调用从服务器发送JSON,以将应用程序存储在其数据库中。
我的问题
此数据的规模非常大,有些表可以记录一百万条记录,电话数据库的最终大小可以达到100mb。
REST端点必须限制其数据,并且必须以不同的偏移量多次调用才能实现整个同步。
因此,我正在寻找提高此过程效率的方法。
我的想法
我的想法是创建一个可以在服务器上运行的脚本,该脚本将从服务器数据库创建一个sqlite文件,将其压缩并将其放置在供应用程序下载的位置。有效地创建服务器当前数据的快照。
应用程序将下载此快照,但如果自快照发生以来发生了某些更改,则仍必须调用其REST方法。
问题
这将给我的Web应用程序增加另一级别的复杂性,我想知道这是否是正确的方法。人们在同步大量数据时还使用其他技术吗?
答案 0 :(得分:2)
这是一个复杂的问题,因为答案应取决于您的约束条件:
数据多久更改一次?如果太频繁,那么快照将很快过时,因此应用程序将有效地更新数据。而且,由于数据量很大,应用程序将浪费CPU时间进行同步(即使用户没有积极使用所有数据!),或者可能很快与服务器不同步-对于iOS尤其如此,与Android应用程序相比,应用程序具有非常有限的后台功能(只有小窗口,这是受限制的)。
该数据库是只读的吗?您是否正在向服务器发送更新?如果是这样,则您需要准备解决冲突的技术,并涵盖其中的数据被修改但没有立即发布到服务器的案例。
您需要支持数据库方案更改时的情况。有效地采用这种方法,您需要为不同版本的应用程序准备好多个(初始)数据库。
您的想法是好的,以防对数据库进行的更新太多而常规的下载方式效率不高(这是您通常描述的情况:通过多个REST调用发送数百万条记录是很痛苦的。) / p>
但是,要当心壁垒:万一数据变化很大,并且您每天被迫在每台设备上更新成千上万的记录,那么您可能需要考虑一种完全不同的方法:可能需要您的应用程序仅支持部分离线模式(针对最新/重要项目)或数据模型的混合方法(因此,对于用户希望编辑某些内容的最新数据,请执行实时请求)。
答案 1 :(得分:0)
100mb并不大。我的应用目前已经同步了许多GB。如果您的数据可以静态生成和更新,那么您可以做的一件事就是将所有内容(例如json,图像等)写入服务器,然后在本地文件系统上同步所有内容。就我而言,我使用S3。在选定的时间或用户希望的时间,他们会同步,并且只会拉动/更新更改内容。 AWS实际上在本地/远程文件夹或存储桶上有一个名为sync的api调用。一个电话。我的确是自定义的,但本质上是相同的,请检查lastupdate日期并在本地文件大小,如果不同,则将其添加到下载队列中。