联机和脱机同步


Online and offline synchronization

由于互联网不稳定,我正在进行一个同步在线和离线功能的项目。我已经想出了一个可能的解决方案。也就是说,为在线和离线创建两个类似的数据库,并将两者同步。我的问题是,这是一个好方法吗?还是有更好的选择?

我在网上研究过这个问题,但没有发现任何实质性的东西。我发现一个有用的链接是关于数据库复制的。但我希望离线版本能检测到互联网的存在并相应地同步。

你能帮我找到解决问题的方法或线索吗?

我建议您有一个用于同步的在线存储和一个本地数据库(浏览器indexeddb、程序sqllite或类似的数据库),并将您的所有更改记录在本地数据库中,但要记录上次同步后输入的数据。

当你有连接时,你会以设定的间隔将所有新数据与在线存储同步(比如每5分钟一次,或者如果你有带宽/cpu容量,则是恒定流)

当用户从"新鲜"位置登录时,在线数据库将所有数据推送给客户端,客户端将数据填充到本地数据库中,然后恢复正常的同步功能。

计划A:主-主复制(以前称为主-主复制)。您确实需要小心PRIMARY KEYsUNIQUE密钥。而";其他";机器处于脱机状态,您可能会向表中写入冲突的值。稍后,当他们尝试同步时,复制将冻结,需要手动干预。(不太好看。)

计划B:将更改写入数据库以外的某些存储。这与计划A有着相同的缺点,而且你需要一堆代码来实现它

方案C:Galera集群,有3个节点。当所有3个节点都启动时,所有节点都可以进行写入。如果一个节点出现故障,或网络问题使其他两个节点看起来离线,则它将自动变为只读。事情解决后,同步会自动完成。

D计划:只写信给可靠的小学;让另一个是只读副本。(但这违反了你对"不稳定互联网"的要求。)

这些都不完全符合要求。A计划似乎是唯一有机会的。让我们看看这个。

如果在任何表中有任何UNIQUE键,并且可能会向其中插入新行,则问题存在。即使是像"规范化表"这样无害的东西,在其中插入name并返回id以在其他表中使用,也存在问题。您可以在具有相同name的两台服务器上执行此操作,并获得不同的ids。现在你有一个几乎不可能修复的烂摊子。

不确定是否在项目范围之外,但您可以尝试以下方法:

https://pouchdb.com/

https://couchdb.apache.org/

"PouchDB是一个受Apache CouchDB启发的开源JavaScript数据库,旨在在浏览器中运行良好。

PouchDB的创建是为了帮助web开发人员构建离线和在线一样工作的应用程序。它使应用程序能够在离线时本地存储数据,然后在应用程序恢复在线时将其与CouchDB和兼容服务器同步,无论用户下次登录到哪里,都能保持用户数据的同步"