使用消息队列的Web应用程序的体系结构

时间:2014-03-06 16:48:05

标签: java web-applications rabbitmq activemq message-queue

我有一个java Web应用程序,它通过数据库表(EmailQueue)使用某种形式的自定义消息队列来排队发送电子邮件。该应用程序部署在Tomcat上,并使用Quartz作业轮询EmailQueue表中的新条目以进行发送。

我现在需要添加一些其他类型的作业和消息(通知,短信等)的排队,因此我们正在考虑使用正确的消息队列(RabbitMQActiveMQ等。)而不是数据库。这是由few articles引发的,因此认为数据库不应该用作队列。

然而,我还没有完全了解整个生态系统,并希望得到一些指导。具体做法是:

  • 在Web应用程序的上下文中,消息队列代理通常作为自己的进程运行,就像数据库一样吗?我需要在服务器重启时保持消息持久。
  • 消息队列使用者是应该在Tomcat中作为servlet部署还是作为独立的Java应用程序部署?我对这一切的可管理性特别感兴趣(即启动/停止实例,配置,监控)相关questionemail thread

2 个答案:

答案 0 :(得分:2)

1。在Web应用程序的上下文中,消息队列代理通常作为自己的进程运行,就像数据库那样?我需要在服务器重启时保持消息持久性。

消息队列代理通常作为自己的进程运行。使用RabbitMQ,您的生产者可以将消息定义为持久性。

2。消息队列使用者是应该在Tomcat中作为servlet部署还是作为独立的Java应用程序部署?我对它的可管理性特别感兴趣(即启动/停止实例,配置,监控)相关问题和电子邮件线程。

关于类似主题here的问题,我最终将我的消费者部署为Tomcat应用程序,这确实为我提供了我也在寻找的可管理性。这允许我编写用于监视和管理队列的servlet。

此解决方案适用于可扩展性,这对于消息传递和放大很重要。排队。通过拍摄运行Tomcat的服务器(我使用的是Amazon EC2实例)并将该快照部署到新实例上,我还能够轻松地动态扩展消费者数量。我已将Tomcat配置为自动启动为服务,以便在新实例启动时,消费者.war文件将部署并自动开始消费。

但是,正如我的问题中所讨论的那样,请注意线程。我最初遇到了阻止Tomcat的问题。

但是,您也可以使用JMX将消费者作为独立的Java应用程序实现可管理性。使用JConsole,您可以在运行时远程访问Java应用程序和查询/更新参数。许多监控程序(如Zabbix)都可以使用JMX连接到应用程序。

如果您喜欢Web开发并构建自己的Web应用程序,我会选择Tomcat路由。希望有所帮助。

答案 1 :(得分:1)

一个不错的选择!已经编写了面向消息的中间件,可以省去一些麻烦 - 而不是重新发明轮子。

  1. 在完整的Java EE服务器中,消息传递系统通常是一个集成部分。 对于tomcat,请查看TomEE +或类似内容,了解ActiveMQ和Tomcat如何协同工作。
  2. ActiveMQ可以轻松地作为servlet中的嵌入式代理部署,也可以作为独立进程部署。这只是一个可管理性和你喜欢的问题。我会考虑一个独立的ActiveMQ,因为您可能希望在某些情况下添加更多Tomcat服务器,并指向同一个ActiveMQ服务器。 RabbitMQ不是在Java上运行,而是在Erlang平台上运行 - 所以这是不同的。

    1. 这取决于您的架构,您觉得管理起来更舒服。部署为servlet似乎是一种合理的方法,因为您可能已经有监控和其他事情。
    2. 您也可以在ActiveMQ内部运行邮件服务。您可以轻松地在SpringMQ配置中嵌入spring bean - 或者,最好使用Camel Routes运行mail functionality,使用简单的XML配置执行这些操作。如果邮件使用者中有很多逻辑,那么它应该作为servlet应用程序的一部分保存。