4

您如何通过网络在两个进程(例如客户端和服务器)之间实时同步数据?

我在服务器上构建了各种文档/数据集,由客户端下载和显示。下载后,文档会收到持续更新以保持最新状态。

这似乎是一个简单且常见的概念,但我找不到任何提供这种抽象级别的工具。我什至不确定我在寻找什么。也许有一个类似的概念与可靠的工具支持?也许有一系列不同的工具必须放在一起?这是我到目前为止所考虑的:

  • 我需要在单跳 (0.5 RTT) 中传播每个更改,这排除了轮询 (通常 >10 RTT) 和缓存失效技术 (1.5 RTT)。
  • 数据复制和简单的通知广播不是一个选项,因为数据太多,变化太多。客户必须能够选择要下载的特定文档并监控更改。
  • 我目前正在使用消息传递模式,它可以完成这项工作,但它毫无希望地没有生产力。它的抽象级别太低了。它很费力,容易出错,而且随着应用程序复杂性的增加,它不能很好地扩展。
  • HTTP 和其他类似 RPC 的技术适用于初始获取,但它们鼓励轮询以进行后续同步。在执行反向请求(从数据源到数据消费者)时,可以进行更改通知,但它比消息传递还要复杂。
  • 由于协调两个并行连接上的通信所涉及的复杂性以及两种范式之间的阻抗不匹配,将 RPC(用于初始获取)与消息传递(用于更新)结合起来是一场噩梦。我需要统一的东西。
  • WebSocket 和 Comet 是实现更改通知的流行方法,但它们需要额外的库来提高生产力,而且我不知道有任何库适合我的应用程序。
  • 消息队列只是在网络上放置一个中介,同时保持基本的消息传递模式。自定义消息过滤器/路由器让我更接近实时文档的概念,但我觉得我正在 MQ 之上实现自定义中间件层。

我有很多额外的要求(两端的原生可观察数据结构 API、增量更新、自定义消息过滤器、自定义连接路由、跨平台、健壮性和可扩展性),但在考虑这些要求之前,我需要找到一些工具最少尝试做我需要的事情。出于标准原因,我试图避免使用内部框架——成本、上市时间、长期维护以及让开发人员满意。

4

1 回答 1

0

我目前的结论是,没有这样的实时文档同步框架。内部解决方案是可行的方法,但许多现有组件可以用作解决方案的一部分。

在 WebSocket 或任何其他消息传递平台之上分层实时文档逻辑非常简单。服务器只是在连接启动时将文档作为单独的消息发送,然后在每次更改后发送。必须添加自动重新连接和一些连接监控来处理网络故障。

两端的序列化是许多现有库针对的单独问题。检测服务器端数据结构的变化(需要启动推送)是另一个独立的问题,它有自己的一套模式和工具。增量更新和许多其他问题可以通过拦截连接的中介来解决。

这种方法将以大量的内部粘合代码为代价与当前技术一起使用。当标准组件可用时,它可以逐步替换为标准组件。

WebSocket 已经包含资源 URI、路由和其他一些不错的功能。未来可能会出现有用的中介和图书馆。带有文本/事件流 MIME 类型的 HTTP 是 WebSocket 未来可能的替代方案。HTTP 的优点是现有工具只需稍加修改即可重复使用。

尽管有丰富的工具支持,我已经完全抛弃了将 RPC 拉取与单独的推送通道相结合的模式。在 0.5 RTT 中推送所有内容需要推送通道使用与拉取通道完全相同的技术,即反向 RPC。反向 RPC 类似于消息传递,只是它引入了冗余返回,丢弃了有用的连接语义,并且难以将与内容无关的中介插入到流中。

于 2013-07-24T20:42:58.047 回答