简而言之,我正在开发一个项目,我们正在为所有常见原因重写大型Web应用程序.重写的主要目的是将在单个服务器上运行的大型单个应用程序分离为许多较小的解耦应用程序,这些应用程序可以在许多服务器上运行.
好的,这就是我想要的:
我想HTTP
成为主要的运输机制.当一个应用程序(例如CMS)已更新时,它将通过http联系经纪人并说"I've changed"
,然后经纪人将发回一个200 OK
说"thanks I got the message"
.
然后,代理将查看其他想要了解CMS更改的应用程序列表,并将该消息传递给应用程序在告知代理希望了解该消息时所留下的URL.
其他应用程序将200 OK
在收到消息时返回,如果不是,则代理会保留消息并将其排队,以便下次有人尝试联系该应用程序时.
问题是我甚至不知道从哪里开始或我需要做什么.我一直在寻找XMPP,ActiveMQ,RabbitMQ,Mule ESB等,并可以看到我可以花明年兜兜转转这个东西.
任何人都可以提供个人经验的建议,因为我非常希望避免以艰难的方式吸取教训.
自2003年左右以来,我一直在各种软件系统中使用JMS消息传递.我有一个Web应用程序,其中客户端实际上是JMS主题订阅者.仅仅通过将消息发布到主题中的行为,消息就被服务器推送分散到所有订阅的Web客户端.
Web客户端是基于Flex的.我们的中间层堆栈包括:
Java 6
雄猫6
BlazeDS的
弹簧框架
ActiveMQ(JMS消息代理)
BlazeDS能够配置为JMS的桥梁.它是一个响应Flex客户端远程调用的Tomcat servlet,但是当新消息出现在配置为它的JMS主题中时,它也可以向客户端发送消息.
BlazeDS实现了用于执行服务器端消息推送的Comet模式:
异步HTTP和Comet体系结构异步,非阻塞HTTP编程的介绍
Farata Systems宣布他们已经修改了BlazeDS以使用Jetty延续方法来实现Comet模式.这样可以针对单个物理服务器扩展到数千个Comet连接.
Farata Systems通过Adobe BlazeDS实现性能突破
我们正在等待Adobe在BlazeDS中自己实现对Servlet 3.0的支持,因为基本上我们已经相当坚持在组合中使用Tomcat和Spring.
进行大规模可扩展Comet模式技术的关键是将Java NIO HTTP侦听器与线程池(例如Java 5并发库中的Executor类)结合使用.Servlet 3.0是servlet的异步事件驱动模型,可以与这样的HTTP侦听器绑定在一起.然后可以针对单个物理服务器维持数千个(数量为10,000到20,000)并发Comet连接.
虽然在我们的案例中我们使用Adobe Flex技术将Web客户端转变为事件驱动的消息传递订阅者,但对于任何通用的AJAX Web应用程序都可以这样做.在AJAX圈子中,执行服务器端消息推送的技术通常被称为反向AJAX.你可能已经发现Comet是一个文字游戏,就像Ajax(两个家庭清洁工)的对手一样.不过,对我们来说,最好的事情是,我们只是将我们的碎片连接起来然后离开.通用AJAX Web编码器将有更多的编程工作要做.(即使是通用的Web应用程序也可以与BlazeDS一起使用 - 它只是对BlazeDS能够进行的AMF编组没有任何用处.)
最后,Adobe和SpringSource正在合作,与Spring-Framework一起建立一个更平滑,开箱即用的BlazeDS集成:
Adobe与SpringSource合作以增强Flash和SpringSource平台之间的集成
首先,不要担心ESB.您所描述的情况完全在简单的面向消息的中间件的范围内.如果你正在做中介,基于内容的路由,协议转换等事情,你只需要"ESB"; 东西的地方中间件做东西的消息,就可以路由到正确的位置上.
如果你有一组不同的目标应用程序需要相互通信 - 听起来就像你那样 - 你是对的,通过语言无关的协议(如XMPP,STOMP或HTTP)发送消息是一个很好的解决方案.它基本上意味着您不必编写和运行大量Java守护程序来将消息转换为您喜欢的JMS风格.
消息代理越来越多地支持STOMP,特别是开源代码,并且有许多不同的客户端库.它是一种轻量级协议,专为消息传递而设计,因此您可以获得比使用HTTP更丰富的功能.
对我来说,XMPP是一个弱选项,因为它在服务器端没有得到很好的支持,尽管能够为你的经纪人提供IM很有趣:)
如果你在HTTP上设置,OpenMQ非常好,我个人使用它的通用消息服务 - 基本上是围绕JMS目的地的webapp包装器.它提供了一个REST-ful接口,与STOMP提供的动词类似.