首页 文章

客户端 - 服务器同步模式/算法?

提问于
浏览
202

我觉得必须有客户端 - 服务器同步模式 . 但我完全没有谷歌一个 .

情况非常简单 - 服务器是中心节点,多个客户端连接并操作相同的数据 . 数据可以在原子中分割,如果发生冲突,服务器上的任何内容都具有优先级(以避免让用户解决冲突) . 由于可能存在大量数据,因此首选部分同步 .

对于这种情况是否存在任何模式/良好实践,或者如果您不知道 - 您的方法是什么?

以下是我现在想要解决的问题:与数据并行,将保留修改日志,使所有交易都有时间戳 . 当客户端连接时,它会以统一的形式接收自上次检查以来的所有更改(服务器遍历列表并删除添加后跟随删除,合并每个原子的更新等) . 瞧,我们是最新的 .

备选方案是保留每条记录的修改日期,而不是执行数据删除,只需将它们标记为已删除即可 .

有什么想法吗?

5 回答

  • 80

    您应该了解分布式变更管理的工作原理 . 查看管理增量工作的SVN,CVS和其他存储库 .

    你有几个用例 .

    • 同步更改 . 您的更改日志(或增量历史记录)方法看起来很好 . 客户端将其增量发送到服务器;服务器整合并将增量分配给客户端 . 这是典型的情况 . 数据库称之为“事务复制” .

    • 客户端已失去同步 . 通过备份/恢复或由于错误 . 在这种情况下,客户端需要从服务器获取当前状态而不通过增量 . 这是从大师到细节,三角洲和表现的副本 . 这是一次性的事情;客户坏了;不要试图优化这一点,只需实现可靠的副本 .

    • 客户端存在疑问 . 在这种情况下,您需要将客户端与服务器进行比较,以确定客户端是否是最新的并且需要任何增量 .

    您应该遵循数据库(和SVN)设计模式,按顺序编号每个更改 . 这样,客户端在尝试同步之前可以提出一个简单的请求(“我应该有什么修订?”) . 即便如此,查询(“自2149年以来的所有增量”)对于客户端和服务器来说都是非常简单的 .

  • 23

    你真正需要的是Operational Transform(OT) . 在许多情况下,这甚至可以迎合冲突 .

    这仍然是一个活跃的研究领域,但有各种OT算法的实现 . 我已经参与了这样的研究多年了,所以请告诉我这条路线是否让您感兴趣,我很乐意为您提供相关资源 .

  • 23

    作为团队的一员,我做了很多涉及数据同步的项目,所以我应该有能力回答这个问题 .

    数据同步是一个相当广泛的概念,有太多的讨论方法 . 它涵盖了一系列不同的方法,包括它们的优点和缺点 . 以下是基于两个视角的可能分类之一:同步/异步,客户端/服务器/点对点 . 同步实施严重依赖于这些因素,数据模型复杂性,传输和存储的数据量以及其他要求 . 因此,在每种特定情况下,选择应该支持满足应用程序要求的最简单实现 .

    基于对现有现成解决方案的回顾,我们可以描述几个主要的同步类,不同的是同步对象的粒度:

    • 整个文档或数据库的同步用于基于 Cloud 的应用程序,例如Dropbox,Google Drive或Yandex.Disk . 当用户编辑并保存文件时,新文件版本将完全上载到 Cloud 端,覆盖较早的副本 . 如果发生冲突,则会保存两个文件版本,以便用户可以选择哪个版本更相关 .

    • 键值对的同步可以在具有简单数据结构的应用程序中使用,其中变量被认为是原子的,即不分成逻辑组件 . 此选项类似于同步整个文档,因为值和文档都可以完全覆盖 . 但是,从用户的角度来看,文档是由许多部分组成的复杂对象,但键值对只是短字符串或数字 . 因此,在这种情况下我们可以使用更简单的冲突解决策略,考虑 Value 更相关,如果它是最后一个改变 .

    • 结构化为树或图的数据的同步用于更复杂的应用程序,其中数据量足够大,以便在每次更新时完整地发送数据库 . 在这种情况下,必须在单个对象,字段或关系的级别上解决冲突 . 我们主要关注这个选项 .

    所以,我们把这些知识运用到了这篇文章中,我觉得这篇文章可能对每个对这个主题感兴趣的人非常有用=>基于核心数据的iOS应用程序中的数据同步(http://blog.denivip.ru/index.php/2014/04/data-syncing-in-core-data-based-ios-apps/?lang=en

  • 11

    问题不是很明确,但如果我是你,我会调查optimistic locking . 它可以使用服务器为每条记录返回的序列号来实现 . 当客户端尝试保存记录时,它将包含从服务器接收的序列号 . 如果序列号与's in the database at the time when the update is received, the update is allowed and the sequence number is incremented. If the sequence numbers don'匹配的序列号匹配,则不允许更新 .

  • 0

    对于delta(更改)同步,您可以使用pubsub模式将更改发布回所有订阅的客户端,像pusher这样的服务可以执行此操作 .

    对于数据库镜像,一些Web框架使用本地迷你数据库将服务器端数据库同步到浏览器数据库中的本地,支持部分同步 . 检查meteror .

相关问题