java - 使用消息队列的 Web 应用程序架构

标签 java web-applications rabbitmq activemq message-queue

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

我现在需要添加一些其他类型的作业和消息(通知、短信等)的队列,因此我正在考虑使用合适的消息队列(RabbitMQActiveMQ 等)而不是数据库。这是由 few 激发的。 articles关于争论数据库不应用作队列的问题。

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

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

最佳答案

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 路线。希望对您有所帮助。

关于java - 使用消息队列的 Web 应用程序架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22230781/

相关文章:

java - 如何使用 Java 将数据保存到 Firebase(桌面)

java - 每当我说@Transactional 时,回滚每个检查的异常

java - 大型 java 项目所有模块的数据库连接设置

web-applications - 何时使用桌面应用程序与网络应用程序?

java - 关于tomcat和jmx的问题

java - 使用 Apache POI 列出 Excel 中所有定义的名称

RabbitMQ 可用磁盘空间不足

python - Celery/RabbitMQ/Django 没有运行任务

javascript - 如何在发布新消息之前删除rabbitmq中的特定消息?

java - hadoop输入路径指定文件夹范围