我正在开发一个由于互联网不稳定而同步在线和离线功能的项目。我想出了一个可能的解决方案。这是为在线和离线创建2个类似的数据库并同步这两个数据库。我的问题是,这是一个好方法吗?还是有更好的选择?
我已就此主题进行过网上研究,但我还没有发现任何实质性问题。我发现一个有用的链接是数据库复制。但我希望离线版本能够检测互联网的存在并进行相应的同步。
请你帮我找到解决问题的方法或线索
答案 0 :(得分:2)
A 计划:Primary-Primary 复制(以前称为 Master-Master)。您确实需要小心 PRIMARY KEYs
和 UNIQUE
键。当“另一台”机器离线时,您可以将冲突的值写入表中。稍后,当他们尝试同步时,复制将冻结,需要手动干预。 (不是一个漂亮的景象。)
计划 B:将更改写入数据库以外的某些存储。这与计划 A 存在相同的缺点,而且您需要编写大量代码来实现它。
计划 C:具有 3 个节点的 Galera 集群。当所有 3 个节点都启动时,所有节点都可以进行写入。如果一个节点出现故障,或网络问题使其对另外两个节点看起来离线,它将自动变为只读。问题解决后,同步会自动完成。
计划 D:只写入可靠的主节点;让另一个成为只读副本。 (但这违反了您对“互联网不稳定”的要求。)
这些都不完全符合要求。 A计划似乎是唯一有机会的。让我们看看那个。
如果您在任何表中有任何 UNIQUE
键并且您可能会向其中插入新行,则问题存在。即使像“规范化表”这样无害的东西,在其中插入 name
并取回 id
以在其他表中使用,也存在问题。您可能会在具有相同 name
的两台服务器上执行此操作并获得不同的 ids
。现在您遇到了几乎无法修复的烂摊子。
答案 1 :(得分:0)
我建议你有一个用于同步的在线存储和一个本地数据库(浏览器indexeddb,程序sqllite或类似的东西),并记录你本地数据库中的所有更改,但记录了最后输入的数据同步。
当您有连接时,您可以按设定的时间间隔将所有新数据与在线存储同步(例如,如果您有带宽/ CPU容量,则每5分钟一次或恒定流)
当用户从" fresh"在线数据库将所有数据推送到使用数据填充本地数据库的客户端,然后恢复正常的同步功能。
答案 2 :(得分:0)
不确定它是否超出了项目范围,但您可以尝试这些:
" PouchDB 是一个受 Apache CouchDB 启发的开源 JavaScript 数据库,旨在在浏览器中良好运行。
PouchDB 的创建是为了帮助 Web 开发人员构建离线工作和在线工作一样好的应用程序。 它使应用程序能够在离线时将数据存储在本地,然后在应用程序重新上线时将其与 CouchDB 和兼容服务器同步,无论用户下次登录何处,都可以保持用户的数据同步。 "