【发布时间】: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