【发布时间】:2014-04-09 11:03:11
【问题描述】:
我有一个 java web 应用程序,它使用某种形式的自定义消息队列,通过数据库表 (EmailQueue) 来排队发送电子邮件。该应用程序部署在 Tomcat 上,并使用 Quartz 作业轮询 EmailQueue 表中要发送的新条目。
我现在需要添加一些其他类型的作业和消息(通知、短信等)的队列,因此我正在考虑使用适当的消息队列(RabbitMQ、ActiveMQ 等)而不是数据库。这是由 few articles 提出的,他们认为不应将数据库用作队列。
不过,我还没有完全了解整个生态系统,希望得到一些指导。具体来说:
- 在 Web 应用程序的上下文中,消息队列代理是否通常像数据库一样作为自己的进程运行?我需要在服务器重新启动时保持消息的持久性。
- 应该将消息队列消费者部署为 Tomcat 中的 servlet 还是独立的 Java 应用程序?我对这一切的可管理性特别感兴趣(即启动/停止实例、配置、监控)相关 question 和 email thread。
【问题讨论】:
-
你可以有一个嵌入式队列——Spring 提供了一个简单的嵌入式代理。但正如您所指出的,这将代理与 Web 服务器的生命周期联系在一起,或者更糟糕的是,与应用程序本身联系在一起。外部代理更为常见——可能在同一台服务器上运行。就处理程序而言,您可以将它们放在任何地方;您是否希望他们在应用程序停机期间继续处理/排队消息?只需将它们作为服务器上的守护程序服务。然而beware this antipattern.
-
似乎将代理作为单独的进程运行确实更合适。我将阅读那篇文章并浏览 ActiceMQ in Action 以获得更多见解。与 Tomcat servlet 相比,我担心服务器上守护程序服务的监控和管理。可能有解决方案,但我不知道它们。
标签: java web-applications rabbitmq activemq message-queue