我不确定最好的堆栈来构建聊天应用程序。目前我正在考虑两个主要选择:
聊天应用程序需要具备以下条件:
这两个选项看起来都是可扩展的,所以我并不担心(我们也考虑在亚马逊的ec2中运行应用程序)。我知道有一个项目使用龙卷风构建一个xmpp服务器,但它还没有准备好用于生产,我们的截止日期并不是那么大。基本上我的主要担心是开发的简易性,以后稍后使用pubsubhubbub开发聊天应用程序后悔但我在某处读到PubSubHubbub可能最终取代XMPP,因为REST取代了SOAP - 所以你怎么看?
去寻找XMPP。
开箱即用,ejabberd支持您的所有要求。您不需要查看任何erlang并为ejabberd编写自定义模块。使用Strophejs,浏览器中的XMPP(你显然正在做的事情)非常棒。
关于pubsubhubbub替换XMPP的最后一个问题,请不要指望它。 XMPP已经超过10年,在客户端和服务器上都是可靠的开源和专有的可互操作实现,并且非常优雅,因此它不会消失。
而且您正在开发一个聊天应用程序,这是XMPP的用途。
Facebook Tornado根本不使用PubSubHubbub!
去寻找XMPP,它专为您所寻找的设计而设计。龙卷风并非专门用于此,而是针对长期轮询请求。
不需要使用旁遮普,ejabbed http-bind模块现在做得非常好。此外,您不需要学习Erlang,就像在编写使用Apache的Web应用程序时不需要学习C一样:)查看Aristochat等内容。您需要使用的唯一功能是配置XMPP服务器和聊天室,然后是客户端(在浏览器中)的Javascript。
如果您不需要通过XMPP进行联合,但希望快速进行原型设计和快速部署以及开箱即用的可伸缩性,请查看Lift web框架的chat server in one page of code示例。
PubSubHubbub(PuSH)从一开始就不适用于聊天应用程序。它有时被称为“用于Web的IM”。我建议你通过这张幻灯片:Realtime Ruby for the Realtime Web by igrigorik
问题是你想要获得的实时性?如果你想要速度,那么XMPP是最好的选择。(500ms)而PuSH取决于你的饲料及其传递方式。请记住,在内容到达订阅者之前,PuSH总共有4个网络跃点。
更大的麻烦是PuSH依赖HTTP Post。即使您最终设计了基于PuSH的聊天应用程序,并在稍后阶段说,您希望将其提供给其他设备,甚至作为桌面应用程序,您也必须使用XMPP中继相同的内容。您将失去的另一个地方是,您的聊天应用用户很难从他们选择的任何其他IM登录。
您可以将REST API与WebSocket一起使用来实现发布者/订阅者体系结构。
Atmosphere和swagger sockets是很好的java框架,你可以插入你的Jersey REST api并实现这一目标。
Atmospehre的创建者jfarcand的博客有一个使用这些技术构建的example of chat application。