离线/在线数据同步策略

Posted

技术标签:

【中文标题】离线/在线数据同步策略【英文标题】:Strategy for Offline/Online data synchronization 【发布时间】:2010-09-21 06:13:39 【问题描述】:

我的要求是我有服务器 J2EE Web 应用程序和客户端 J2EE Web 应用程序。有时客户端可以离线。当客户端上线时,他应该能够来回同步更改。此外,我应该能够根据一些过滤器/规则来控制需要同步哪些行/表。是否有任何现有的 Java 框架可以做到这一点?如果我需要自己实施,您可以建议哪些不同的策略?

我想到的一个解决方案是在同步期间维护 sql 日志并在另一端执行相同的语句。您认为这种策略有什么问题吗?

【问题讨论】:

【参考方案1】:

有许多用于数据同步/复制的 Java 库。我知道的两个是daffodil 和SymmetricDS。在前世,我愚蠢地(在 Java 中)实现了我自己的数据复制过程。这似乎是一种应该相当简单的事情,但如果数据可以同时在多个地方更新,那就非常复杂了。我强烈建议您使用上述项目之一来尝试绕过自己处理这种复杂性。

【讨论】:

【参考方案2】:

什么最适合作为应用程序中的客户端数据存储?您可以选择嵌入式数据库,如 SQLite 或消息队列或一些对象存储,或者(如果这些都不能使用,因为它是一个 Web 应用程序)使用 Web DB 或 IndexedDB 通过 html 5 保存在客户端上的文件/文档LocalStorageAPI。

查看论文Gold Rush: Mobile Transaction Middleware with Java-Object Replication。 Microsoft 的偶尔连接系统文档描述了两种方法:面向服务或面向消息和面向数据。淘金热采取了较早的方法。后一种方法使用数据库合并复制。

【讨论】:

【参考方案3】:

您的同步器需要确定何时可以更新数据以及何时需要人工调解潜在冲突。我写了一个paper that explains how to do this using logging and algebraic laws。

【讨论】:

还有 Christian Stettler 的硕士论文关于这个问题:ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/… 有很大的安全问题需要解决,本文很好地涵盖了这些问题。 @Jen S. 该链接不再可访问 Wayback Machine 有一个副本:web.archive.org/web/20101126093308/http://www.ifi.uzh.ch/…【参考方案4】:

同步的最大问题是当用户离线编辑某些内容时,它同时在线编辑。您需要合并这两条更改的数据,或者处理 UI 以让用户说出哪个版本是正确的。如果你排除了两者同时被编辑的可能性,那么你就不必解决这个棘手的问题。

该方法通常是在所有表中添加一个“修改”字段,并将给定行中给定记录的客户端修改字段与服务器修改日期进行比较。如果它们不匹配,则替换服务器的数据。

小心使用自动生成的密钥 - 当您从客户端复制到服务器时,您需要确保保持数据完整性。在服务器上再次严格运行 SQL 语句可能会使您处于自动生成的键已更改的情况,并且突然您的外键指向的记录与您的预期不同。

从其他来源导入数据时,您通常会跟踪来自外部来源的主键以及您自己的个人主键。这使得在困难的同步情况下更容易确定数据集之间的变化和差异。

【讨论】:

我投了反对票(对不起),因为我认为它大大简化了所涉及的问题。它根本不涉及安全性或选择性同步。 Stettler 的论文很好地介绍了这些问题 (ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/…) 感谢您的信息。我认为哈姆雷特的链接是一个很好的参考。 Kieveli 回答的关键点足以让一本需要 30 秒阅读的入门书。

以上是关于离线/在线数据同步策略的主要内容,如果未能解决你的问题,请参考以下文章

谷歌浏览器离线在线同步所有数据以及跨浏览器同步数据

推荐一款 在线+离线数据 同步框架 Dotmim.Sync

数据仓库数据同步策略

Redis技术探索「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据)

Redis技术探索「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据)

Redis技术探索「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移Redis数据实战指南(离线同步数据)