Web applications 我应该使用什么库或平台来构建在客户端之间提供实时、异步数据同步的web应用程序?

Web applications 我应该使用什么库或平台来构建在客户端之间提供实时、异步数据同步的web应用程序?,web-applications,synchronization,xmpp,google-wave,Web Applications,Synchronization,Xmpp,Google Wave,这不是一个简单实用的问题,而是一个促进实时数据交换主题讨论的问题 我将从一个例子开始: GoogleWave的核心是一个实时异步数据同步引擎。Wave支持(或计划支持)并发(实时)文档协作、断开连接(脱机)文档编辑、冲突解决、文档历史记录和属性回放,以及服务器联合 Wave的核心部分是操作转换引擎: OT引擎管理文档状态。客户之间的更改被合并,并且每个客户在任何时候都对文档有一个合理和一致的视图;最终的文档最终在所有连接的客户端之间保持一致 我的问题是:这个系统是否足够抽象或通用,可以用作一个库

这不是一个简单实用的问题,而是一个促进实时数据交换主题讨论的问题

我将从一个例子开始:

GoogleWave的核心是一个实时异步数据同步引擎。Wave支持(或计划支持)并发(实时)文档协作、断开连接(脱机)文档编辑、冲突解决、文档历史记录和属性回放,以及服务器联合

Wave的核心部分是操作转换引擎:

OT引擎管理文档状态。客户之间的更改被合并,并且每个客户在任何时候都对文档有一个合理和一致的视图;最终的文档最终在所有连接的客户端之间保持一致

我的问题是:这个系统是否足够抽象或通用,可以用作一个库或通用框架,在此基础上构建web应用程序来同步每个客户端中的实时异步状态

Wave协议是否直接由任何当前的web应用程序使用(除了Google的客户端)?在web应用程序中直接将其用于通用状态同步有意义吗

当构建这样一个Web应用程序时,你会考虑使用其他现有的库或框架吗?

这种应用程序中有多少代码可能是特定于域的逻辑,而不是通用状态同步逻辑?或者,换句话说,状态同步抽象可能有多泄漏


欢迎评论和讨论

杰克·莫菲特(Jack Moffitt)的书“提供了这个问题的答案,包括操作转换位。

HTTP用于处理从客户端到服务器发起的调用,但这是您需要解决的问题。我是一名网络开发人员,所以会使用

浏览器采用Ajax风格 对服务器的请求,该请求被保留 打开,直到服务器有新数据要保存 发送到浏览器,该浏览器被发送到 浏览器将显示完整的响应。 浏览器将启动一个新的长文件 轮询请求以获取 随后的事件

您可以使用名为Lift的Web开发框架构建Comet样式的Web应用程序。(它是用一种称为Scala的编程语言编写的,可以编译成Java字节码,这意味着您可以在Java应用服务器上运行它。)


值得关注的是HTML5,它有一个功能叫Comet,它可能会使Comet过时。

你可以通过类似于PubSubHubbub的东西来实现这一点,我认为它非常简单。 其工作方式:两个系统都必须有RSS/Atom提要来表示数据,或者至少是数据“url上的对象XYZ created”上的事件。。。等等

然后,确保两个提要都已启用PubSubHubbub,这意味着它们可以在更新内容时通知订阅者

将每个组件订阅到其他组件的提要

实现通知时发生的事情:下载文件,更新数据库中的内容。。。你说吧

它最大的优点是它只依赖于“已知”的东西:HTTP,ATOM


举了一个社会数据的例子,但这也适用于任何类型的数据。

就OT实施而言,Wave确实被淡化了,没有——也不能——实现您将在文献中阅读的OT承诺。基于Jupiter协作系统,它仅限于客户端/服务器网络拓扑。谷歌进一步限制了Jupiter OT算法,将给定客户端“正在运行”的操作数量限制为一个,这确实会损害客户端之间的交互

Wave有多“通用”?从我对代码的回忆来看,它似乎与Wave数据模型有着紧密的联系——光点、注释等。因此,我认为如果不进行认真的修改,很难将其应用于其他数据模型

除此之外,我还关心基于Wave的系统的可伸缩性和健壮性。例如,只有一台服务器可以处理给定Wave上的操作,并且不清楚如何实现故障转移支持,因为服务器的任何回滚都是灾难性的,导致所有客户机放弃它们的Wave(包括未完成的操作)

Wave正在积极开发中,因此情况会随着时间的推移而改善


除了Wave,没有太多的选择。如我的中所述,我使用Ceda进行基于OT的同步。Ceda中没有“泄漏抽象”问题-它可以使用OT同步任意数据结构-您的应用程序定义模式。

异步同步?客户端之间的数据正在同步;当一个客户端进行更改时,其他客户端会看到更改。这是异步发生的;当一个客户端进行更改时,它不需要阻止等待服务器或其他客户端接收更改,然后才能继续进行其他更改。此外,在对文档进行更改之前,它不必等待收到其他客户可能有的更改。您能告诉我们Moffitt对此的看法吗?