网络实时同步现场数据

4
如何在网络上实时同步两个进程(比如客户端和服务器)之间的数据?
我在服务器上构建了各种文档/数据集,由客户端下载并显示。一旦下载完成,文档就会不断更新以保持新鲜。
这似乎是一个简单而常见的概念,但我找不到任何提供这种抽象级别的工具。我甚至不确定我在寻找什么。也许有类似的概念具有坚实的工具支持?也许需要组合不同的工具链?以下是我考虑过的:
- 我需要在单个跳(0.5 RTT)中传播每个变化,这排除了轮询(通常> 10 RTT)和缓存失效技术(1.5 RTT)。 - 数据复制和简单通知广播不是选择,因为有太多的数据和太多的变化。客户端必须能够选择要下载和监视更改的特定文档。 - 我目前正在使用消息传递模式,它可以完成任务,但是无望地低效。它在太低的抽象级别上工作。它费力、容易出错,并且随着应用程序复杂性的增加,它不能很好地扩展。 - HTTP和其他类似RPC的技术对于初始获取很好,但它们鼓励轮询进行后续同步。当执行反向请求(从数据源到数据使用者)时,可以进行更改通知,但比消息传递更加复杂。 - 将RPC(用于初始获取)与消息传递(用于更新)组合起来,由于协调两个并行连接上的通信以及两种范例之间的阻抗不匹配而变成了噩梦。我需要统一的东西。 - WebSocket和Comet是实现更改通知的流行方法,但它们需要其他库才能提高生产力,而且我不知道有任何适合我的应用程序的库。 - 消息队列只是在网络上放置中介,同时保持基本的消息传递模式。自定义消息过滤器/路由器使我更接近实时文档概念,但我感觉自己正在实现自定义中间件层。
我有大量其他要求(双端本地可观察数据结构API、增量更新、自定义消息过滤器、自定义连接路由、跨平台、健壮性和可扩展性),但在考虑这些要求之前,我需要找到至少试图做我所需要的工具。我试图避免内部框架的标准原因-成本、上市时间、长期维护和保持开发人员的满意度。

你使用的平台/编程语言是什么?这是一个需要与Web浏览器一起工作的网站,还是你同时在开发客户端和服务器? - John Kugelman
跨平台是首选,但如果它能提高生产力,.NET也可以。我们正在使用ASP.NET、.NET服务、WPF/WinForm客户端以及一些C++和JS进行原型设计。如果产品成功,平台列表将会扩展。 - Robert Važan
1个回答

0

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

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

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

这种方法将使用当前技术,但需要大量内部粘合代码。随着标准组件的推出,它可以逐步替换。

WebSocket已经包含资源URI、路由和一些其他很好的功能。未来可能会出现有用的中间件和库。HTTP与text/event-stream MIME类型是WebSocket的一种可能的未来替代品。 HTTP的优点是现有的工具可以在很少修改的情况下重复使用。

我已经完全抛弃了将 RPC pull 与独立的 push 通道结合的模式,尽管有丰富的工具支持。在 0.5 RTT 中推送所有内容要求 push 通道使用与 pull 通道完全相同的技术,即反向 RPC。反向 RPC 类似于消息传递,但它引入了冗余返回值,抛弃了有用的连接语义,并使得插入内容不可知中间件到流中变得困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接