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

我在服务器上构建了各种文档/数据集,这些文件/数据集由客户端下载并显示。下载后,文档会不断更新以保持最新状态。

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


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


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

最佳答案

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

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

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

这种方法将与当前的技术一起工作,但要花费大量的内部粘合代码。可用标准组件逐步替换它。

WebSocket已经包含资源URI,路由和其他一些不错的功能。有用的中介和图书馆将来可能会出现。带有文本/事件流MIME类型的HTTP将来可能替代WebSocket。 HTTP的优点在于,现有的工具几乎不需要修改就可以重用。

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

07-27 20:35