【问题标题】:Realtime synchronization of live data over network通过网络实时同步实时数据
【发布时间】:2013-07-22 21:18:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的平台/编程语言是什么?这是一个您必须使用网络浏览器的网站,还是您同时开发客户端和服务器?
  • 首选跨平台,但 .NET 也可以,如果它可以提供足够的生产力提升。我们正在使用 ASP.NET、.NET 服务、WPF/WinForm 客户端以及一些 C++ 和 JS 的组合进行原型设计。如果产品成功,平台列表将扩大。

标签: message-queue observer-pattern data-synchronization message-passing change-notification


【解决方案1】:

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

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

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

这种方法将适用于当前技术,但需要大量的内部粘合代码。当标准组件可用时,它可以逐步替换为标准组件。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2021-07-01
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多