在使用服务器推送事件开发分离的,高度可扩展的Web应用程序时有哪些可用选项?

时间:2014-09-28 22:38:30

标签: websocket apache-camel activemq stomp sockjs

我想看看是否有人可以向我澄清一些关于Web应用程序集成的问题。到目前为止,我一直在与CometD和Activemq一起工作了几年的项目,但是,对于我所看到的,还有其他选择更简单,并得到了社区的支持,但我仍然没有全面了解可用的选项。

因此,根据我的理解,目前,将服务器推送事件发送到客户端的最常用方法是使用websockets。实现是特定于服务器的,最常用的似乎是Jetty。但是,因为它需要一个websocket兼容的浏览器,所以有一些框架能够提供websockets并且可以反转ajax技术,以防这不是一个选项,比如SockJS,它具有客户端和服务器端的实现。基于此,从4月开始,有一些模板允许您在幕后使用SockJS,并使用SockJS提供代码的客户端实现,并让程序员以更简单的方式处理服务器端。

除此之外,经纪人可以理解websocket协议,因此经纪人可以从Web浏览器接收消息,然后直接发回消息。还有经纪人也实现的STOMP协议允许系统通过websocket向/从Web浏览器发送/接收消息。 我对此有一个疑问是,STOMP是代理总是用来向Web浏览器发送消息或从Web浏览器接收消息的协议吗?或者只是一种选择?如果是后者会有什么区别?

我看到的另一种选择是使用像camel这样的框架。在这种情况下,Web浏览器将与camel的websocket组件通信,并从那里可以使用jms直接路由到代理。我在此看到的好处是可以将处理器作为从浏览器到代理的路由的一部分,允许进一步的安全处理并减少代理在无效/未授权消息的情况下必须处理的流量。 Camel甚至可以使用STOMP组件监听消息,这将是另一种路由选项。

所以,到目前为止,我不知道我的理解是否正确,或者我是否错过或误解了某些事情。如果一切正常,似乎使用像SockJS这样的框架是目前最好的选择。使用Spring 4来简化操作是一种选择,但并非真正必要。如果项目需要使用jms代理集成不同的系统,那么实现将使用SockJS将消息发送到服务器端,然后将消息路由到正确的系统。但在这一点上,有一些前面提到的选项,比如使用camel来路由消息或直接向代理发送消息。什么是最好的选择,或者会有什么不同?如果我将STOMP添加到问题中,那么这个协议给了我什么,我只能使用websockets或camel来处理它?<​​/ p>

我希望自己清楚明白。我认为这个主题包括几个技术和框架,如果不将帖子扩展到很多,很难表达我的所有顾虑。

提前致谢。

2 个答案:

答案 0 :(得分:0)

简而言之,如果您想要消息传递语义,则应使用消息传递协议,例如STOMP。 WebSockets肯定可以很好地处理与浏览器的通信,但这只是“任何自定义通信”。

如果围绕主题和消息传递的惯例进行设计,系统设计可能会更清晰。服务器后端进程可以轻松地将数据推送到传播到所有客户端的主题,理想情况下无需进一步自定义。

除了STOMP之外,还有一个类似的协议,MQTT也可以在websockets上运行。 ActiveMQ发行版提供了一个聊天演示。 MQTT在Machine2Machine世界“物联网”中非常热门,但我也在Web部署中成功使用它。至少在理论上,MQTT应该运行得非常好,手机应用程序的开销很低,如果你考虑与你的网站并排编写。然后,可以使用单个设置与客户端进行“推送”数据通信。否则,您的应用程序可能使用了MQTT,您的浏览器应用程序将使用普通的websocket,您的后端需要另一种方法将异步事件传递给客户端(通过某些Camel路由器或类似工具)等等。

答案 1 :(得分:0)

一种选择是引入一个代理类,如下所示:

ERM事件路由机制 ERM设计原则:

事件本质上是RESTful API调用。 ERM设计原则如下:

- 所有事件都包含一个RESTful请求URI,其中包含上下文(REST事件资源或事件名称)和可选的查询参数。

- 该事件将包含以自定义“X-”指令为前缀的强制标题。自定义标题列表及其说明如下。

- 每个事件都包含一个以JSON格式编码的可选有效负载。

- 所有事件都将使用异步语义设计,以避免阻塞行为。

- 可以订阅或发布活动。事件路由器将处理已发布的传入事件,并将其发送给所有订阅者。

- 事件路由器将配置为以广播模式(并行分叉)或顺序分叉模式传递事件。

- 事件交付应具有可靠性,所有故障情况均应由发布事件的客户或ERM负责。

- 应该有一种机制来重试失败的消息以进行事件传递。

更多详情:

http://writeulearn.com/scalable-routing-design-principles/