通过网络实时同步实时数据

时间:2013-07-22 21:18:05

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

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

我在服务器上构建了各种文档/数据集,由客户端下载和显示。下载后,文档会不断更新,以保持新鲜感。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

这种方法适用于当前的技术,代价是广泛的内部胶水代码。它可以在标准组件可用时逐步替换。

WebSocket已经包含了资源URI,路由和一些其他不错的功能。未来可能会出现有用的中间人和图书馆。具有text / event-stream MIME类型的HTTP是WebSocket的未来替代方案。 HTTP的优势在于现有工具可以在几乎没有修改的情况下重复使用。

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