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

Java 使用消息队列的web应用程序体系结构,java,web-applications,rabbitmq,activemq,message-queue,Java,Web Applications,Rabbitmq,Activemq,Message Queue,我有一个java web应用程序,它通过数据库表(EmailQueue)使用某种形式的自定义消息队列来排队发送电子邮件。该应用程序部署在Tomcat上,并使用轮询EmailQueue表中要发送的新条目的作业 我现在需要添加一些其他类型的作业和消息(通知、sms等)的队列,因此我正在研究使用适当的消息队列(等)而不是数据库。这是由一个关于数据库不应该被用作队列的争论引起的 不过,我还没有完全了解整个生态系统,希望能得到一些指导。具体而言: 在web应用程序的上下文中,消息队列代理是否通常像数据库

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

我现在需要添加一些其他类型的作业和消息(通知、sms等)的队列,因此我正在研究使用适当的消息队列(等)而不是数据库。这是由一个关于数据库不应该被用作队列的争论引起的

不过,我还没有完全了解整个生态系统,希望能得到一些指导。具体而言:

  • 在web应用程序的上下文中,消息队列代理是否通常像数据库一样作为自己的进程运行?我需要的消息是持久的情况下,服务器重新启动
  • 消息队列使用者应该在Tomcat中作为servlet部署,还是作为独立java应用程序部署?我特别感兴趣的是它的可管理性(即启动/停止实例、配置、监视)和相关的
    • 1。在web应用程序的上下文中,消息队列代理是否通常像数据库一样作为自己的进程运行?我需要的消息是持久的情况下,服务器重新启动

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

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

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

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

      然而,正如我在问题中所讨论的,在线程方面要小心。我最初在阻止Tomcat方面遇到了问题

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


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

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

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

    • 这取决于您的体系结构,以及您觉得更易于管理的内容。作为servlet部署似乎是一种合理的方法,因为您可能已经有了监控和其他东西

    • 您也可以在ActiveMQ内部运行邮件服务。您可以轻松地将Springbean嵌入到ActiveMQ配置中——或者,最好是使用运行,它可以通过简单的XML配置完成这类工作。如果您在邮件消费者中有很多逻辑,那么它可能应该作为servlet应用程序的一部分保留。

      您可以有一个嵌入式队列—Spring提供了一个嵌入的简单代理。但正如您所指出的,这将代理与web服务器的生命周期联系起来,或者更糟糕的是,与应用程序本身联系起来。外部代理更常见-可能运行在同一台服务器上。至于处理器,你可以把它们放在任何地方;您希望他们在应用程序停机期间继续处理/排队消息吗?服务器只是将它们作为服务器上的守护程序服务。然而,将代理作为一个单独的进程运行似乎更合适。我将阅读这篇文章并浏览ActionMQ以获得更多的见解。与Tomcat servlet相比,我担心服务器上守护程序服务的监视和管理。可能有解决方案,但我现在还不知道。此外,我使用了RabbitMQ(出于许多原因),但AMQP是跨平台互操作的。我不后悔这个决定。我认为使用web应用程序作为消费者是对Tomcat的滥用。这可能会使最初的管理更容易,但它们不是web应用程序,因此不应该这样部署。感谢@littleK的输入。我希望能够在没有Tomcat的情况下部署消息处理实例,并且我倾向于Boris the Spider的参数,因此我现在正在探索独立的java流程。无论如何,我以后总可以切换到Tomcat。无论如何,代理绝对是独立的。谢谢@Petter提供的信息。这使我走上了正确的道路。我现在不使用Spring,所以我不会走这条路,但很高兴知道。