【问题标题】:Online and offline synchronization线上线下同步
【发布时间】:2015-04-28 13:14:11
【问题描述】:

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

我在网上对此主题进行了研究,但没有发现任何实质性内容。我发现的一个有用链接是关于数据库复制。但我希望离线版本能够检测互联网存在并相应地进行同步。

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

【问题讨论】:

标签: php mysql architecture


【解决方案1】:

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

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

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

【讨论】:

  • 迈克尔,非常感谢您的回复。听起来不错,但你能详细说明一下吗?
  • 您还没有提供代码,发布了一个通用问题并且您希望得到详细的答案?您需要知道的一切都在答案中。
【解决方案2】:

Plan A:Primary-Primary 复制(以前称为 Master-Master)。您确实需要小心 PRIMARY KEYsUNIQUE 键。当“其他”机器离线时,您可以将冲突的值写入表。稍后,当他们尝试同步时,复制将冻结,需要手动干预。 (不是一个漂亮的景象。)

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

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

计划 D:仅写入可靠的 Primary;让另一个成为只读副本。 (但这违反了您对“不稳定的互联网”的要求。)

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

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

【讨论】:

    【解决方案3】:

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

    https://pouchdb.com/

    https://couchdb.apache.org/

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 2018-12-23
      • 2016-01-20
      相关资源
      最近更新 更多