2014-03-06 48 views
1

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

我现在需要添加一些其他类型的作业和消息(通知,短信等)的排队,因此正在寻找使用适当的消息队列(RabbitMQ,ActiveMQ等)而不是数据库。这是因为一个数据库不应该被用作队列的问题上的一个fewarticles

但是我还没有完全想到缠绕整个生态系统,所以希望得到一些指导。具体来说:

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

您可以拥有一个嵌入式队列--Spring提供了一个嵌入式的简单代理。但正如你指出的那样,将代理与Web服务器的生命周期联系起来,或者更糟糕的是,应用程序本身。外部代理更常见 - 可能运行在同一台服务器上。就处理程序而言,你可以将它们放在任何地方;您是否希望他们在应用程序停机期间继续处理/排队消息?简单地把它们作为服务器上的守护进程服务。但[请注意这个反模式](http://sensatic.net/messaging/messaging-anti-patterns-part-1.html)。 –

+0

它似乎确实运行经纪人作为一个单独的过程确实更合适。我会阅读该文章并浏览ActiceMQ in Action以获取更多见解。与Tomcat servlet相比,我担心监视和管理服务器上的守护进程服务。可能有解决方案,但我不知道它们。 – bernie

回答

2

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

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

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

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

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

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

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

如果您喜欢网页开发和构建您自己的Web应用程序,我会去Tomcat路线。希望有所帮助。

+0

另外,我使用了RabbitMQ(出于很多原因),但AMQP是跨平台互操作的。我不后悔这个决定。 – littleK

+0

我认为使用网络应用程序作为消费者是滥用Tomcat。它最初可能会使管理更容易,但它们不是Web应用程序,因此不应该这样部署。 –

+0

感谢您的输入@littleK。我希望能够在没有Tomcat的情况下部署消息处理实例,并且我倾向于Boris the Spider的参数,所以我现在正在探索独立的java进程。无论如何,我总是可以切换到Tomcat。无论如何,这位经纪人绝对是独立的。 – bernie

1

不错的选择!面向消息的中间件已经编写完成,将为您节省一些麻烦 - 而不是重新发明轮子。

  1. 在完整的简介Java EE服务器中,消息传递系统通常是一个集成部分。 对于tomcat,请看TomEE +或类似的关于ActiveMQ和Tomcat如何协同工作的想法。

可以轻松地将ActiveMQ作为servlet中的嵌入式代理部署,也可以作为独立进程部署。这只是一个可管理性和你喜欢的事情。我会考虑独立的ActiveMQ,因为您可能想在某些情况下添加更多的Tomcat服务器,并将它们指向同一个ActiveMQ服务器。 RabbitMQ不是在Java上运行,而是在Erlang平台上运行 - 所以这有些不同。

  1. 这取决于您的架构,您觉得更舒适的管理。部署为servlet似乎是一种合理的方法,因为您可能已经进行了监视和其他事情。

你可以在ActiveMQ本身内部运行邮件服务。您可以轻松地将Spring Bean嵌入到ActiveMQ配置中 - 或者,最好使用mail functionality运行Camel Routes,它使用简单的XML配置执行这些操作。如果您在邮件使用者中有很多逻辑,那么它可能应该保留为servlet应用程序的一部分。

+0

感谢@Petter的信息。它使我走上正轨。我现在不使用Spring,所以我不会走这条路,但很高兴知道。 – bernie

相关问题