线上线下同步

Online and offline synchronization

由于网络不稳定,我正在做一个在线和离线功能同步的项目。我想出了一个可能的解决方案。即为在线和离线创建2个相似的数据库并同步两者。我的问题是这是一个好方法吗?或者有更好的选择吗?

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

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

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

建立连接后,您会按设定的时间间隔将所有新数据与在线存储同步(例如每 5 分钟一次或持续流,如果您有 bandwidth/cpu 容量)

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

A 计划:Primary-Primary 复制(以前称为 Master-Master)。您确实需要小心 PRIMARY KEYsUNIQUE 键。当“其他”机器离线时,您可以将冲突的值写入 table。稍后,当他们尝试同步时,复制将冻结,需要手动干预。 (不太好看。)

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

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

方案D:只写入可靠的Primary;让另一个成为只读副本。 (但这违反了您关于“unstable Internet”的要求。)

其中

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

如果您在任何 table 中有任何 UNIQUE 键并且您可能会向其中插入新行,则问题存在。即使是像 'normalization table' 这样无害的东西,你插入一个 name 并取回一个 id 用于其他 tables 也有问题。您可能会在具有相同 name 的两台服务器上执行此操作并得到不同的 ids。现在你遇到了一个几乎无法修复的烂摊子。

不确定它是否超出项目范围,但您可以尝试这些:

https://pouchdb.com/

https://couchdb.apache.org/

" PouchDB 是一个开源 JavaScript 数据库,其灵感来自 Apache CouchDB,旨在 运行 在浏览器中运行良好。

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