代码之家  ›  专栏  ›  技术社区  ›  Jaanus

如何为设备和服务器之间的元数据同步设计高级应用程序协议和数据格式?

  •  7
  • Jaanus  · 技术社区  · 15 年前

    我的目标是:用户可以在任何设备上或web上与应用程序数据交互。此协议的目的是通过服务器将一个端点上所做的更改传递给其他端点,并确保所有设备保持应用程序数据的一致图片。如果用户在一个设备或web上进行了更改,协议将把数据推送到中央存储库,其他设备可以从中央存储库中提取数据。

    其他一些设计思想:

    • 我称之为“元数据同步”,因为有效负载非常小,以对象ID和有关这些ID-s的小元数据的形式出现。当客户端终结点通过此协议检索新元数据时,它们将基于此元数据从外部源获取实际对象数据。获取“真实”对象数据超出了范围,这里只讨论元数据同步。
    • 将HTTP用于传输,将JSON用于有效负载容器。问题基本上是关于如何最好地设计JSON负载模式。
    • 我希望这在网络上,桌面和移动设备上易于实现和维护。最好的方法是简单的基于计时器或事件的HTTP请求/响应,而不需要任何持久通道。另外,你不应该有博士学位来读,我希望我的说明书能放在两页纸上,而不是200页。
    • 目标是设备上数据的最终一致性,它不是完全实时的。例如,用户可以在脱机时在一个设备上进行更改。再次联机时,用户将执行“同步”操作来推送本地更改和检索远程更改。
      • 在设备上从头开始,应该能够拉取整个元数据图片

    作为一个具体的例子,你可以考虑Dropbox(这不是我正在研究的,但它有助于理解模型):在一系列设备上,用户可以管理文件和文件夹,将它们移动,创建新的,删除旧的等等。在我的上下文中,“元数据”是文件和文件夹结构,而不是实际的文件内容。元数据字段应该类似于文件/文件夹名称和修改时间(所有设备都应该看到相同的修改时间)。

    感觉这有两种方法:

    • 事务性消息。系统中的每个变化都表示为delta,端点与这些delta通信。示例:DVCS变更集。
    • REST:将对象图作为一个整体或部分进行通信,而不必担心单个原子的变化。

    编辑: 一些正确的回答说,没有足够的信息提供足够好的建议。应用程序的确切性质可能会分散注意力,但一个非常基本的RSS阅读应用程序是一个很好的近似。因此,假设应用程序规范如下:

    • 我可以添加、重命名和删除订阅源。添加提要订阅它并开始接收该提要的项。我还可以在UI中重新排序feed显示顺序。
    • 当我阅读项目时,它们被标记为已读。我不能将它们标记为未读或对它们做任何其他事情。
    • 基于以上,对象模型为:
      • “item”具有“url”和“unread”属性,以及多对一关系“feed”(每个item都属于一个feed)url“也作为项目的GUID。
      • 实际项目内容在每个设备上本地下载,不属于同步的一部分。

    基于这种设计,我可以在一台设备上设置我的应用程序:添加一堆订阅源,重命名并重新排序,然后读取其中的一些项目,然后将其标记为未读。当我切换设备时,另一个设备可以同步配置,并显示具有相同名称、顺序和相同项目读/未读状态的相同提要列表。

    (结束编辑)

    我想要的答案是:

    • 有什么好的背景资料?(我意识到这是许多计算机科学课程谈论的非常详细和详细的。。。我希望通过看一些速成课程或掘金来缩短时间。)
    • 有哪些这样的协议的好例子,我可以模仿,甚至使用开箱即用?(我在上面提到Dropbox和IMAP。。。我应该读一下IMAP的RFC。)
    4 回复  |  直到 15 年前
        1
  •  1
  •   djna    15 年前

    有几个想法:

    1) 是的。您可以对变更通知交付的可靠性做出哪些假设?以及这些通知排序的可靠性?我的看法是,最好是通过恢复请求完全重新传递元数据来容忍丢失和错误的顺序。

    2) 是的。实际上你有一个元数据流和一个数据流。你能对它们的相对顺序做些什么假设。你能在元数据到达之前接收到新版本的数据吗?再猜猜,我怀疑这可能发生。我希望数据有效负载必须包含元数据版本信息。因此,客户机可以在需要时刷新元数据?

    3) 是的。与两个不同版本的元数据对应的数据是否可能到达设备。我怀疑是的。客户有多容易处理这个问题?

    4) 是的。元数据可能需要包含表示或验证信息。

        2
  •  1
  •   Ville Laitila    15 年前

    你描述的元数据听起来像图表。然而,切换到OWL/RDF轨道可能是一个很大的转变。基本上,您只需要在可能相互关联的对象上拥有属性(例如,在层次结构中对齐的文件)。从这个角度来看,如果与REST API结合使用,JSON对于属性访问来说是非常自然的选择。如果选择这种方法,我建议你 Open Data Protocol 第一。

    Git ,并将属性作为JSON对象放在系统中的文本文件中?如果每个对象的元数据存储在一个单独的文件中的非常小的JSON块中,系统将自动执行大多数更新和自动冲突解决。大多数版本控制系统为这类目的提供了良好的api。

        3
  •  1
  •   Jiri Klouda    15 年前

    编辑:如果您使配置文件易于合并为一个文件,那么您只需要保留两个版本的配置文件。一个基本版本,上次同步时配置的样子。一个当前版本的元数据,然后你得到你的对等版本的元数据。有了这3个文件,您可以进行一个简单的3向合并,自动决定新版本的冲突,就是这样。保持基本版本很重要。现在,如果您与多个客户机合并,您可以在不同的点合并,因此需要不同版本的配置文件作为基础。只需保留同步的每个结果,直到用来自对等客户端的新同步覆盖它。理论上,您可以拥有XML配置文件,但是XML文件的3路合并非常痛苦,工具还没有完全实现,imho。应用程序的具体格式或类型并不重要。

        4
  •  1
  •   loretoparisi    13 年前