【问题标题】:ActiveMQ standalone server deployment or embedded in a Spring WebappActiveMQ 独立服务器部署或嵌入 Spring Webapp
【发布时间】:2012-06-24 19:27:57
【问题描述】:

我需要设计一个通知/发布的应用程序,它的子系统发送电子邮件。 我计划使用 jms 发布/订阅(主题)消息来做到这一点

目前的可见性,将有 20 到 30 个订阅者,并且将发布的消息数量将在每天 30000 到 50000 条消息的范围内。

我已经计划使用ActiveMQ JMS+Spring 3+Tomcat 6 实现 问题

  1. 我是 JMS 的新手,我想知道上面的负载是否高?

  2. 我们真的需要在服务器上部署单独的 ActiveMQ,还是在 Web 应用程序中使用嵌入式 ActiveMQ 就足够了?

  3. 独立的 ActiveMQ 服务器/嵌入式有哪些优点/缺点?

【问题讨论】:

    标签: jakarta-ee jms activemq setup-deployment


    【解决方案1】:

    很难判断负载是否高。这实际上取决于消息的大小以及您是否使用持久消息和事务。假设它们只有大约 10KB,您应该使用一台服务器就可以了。

    嵌入与独立的问题是一个很好的问题。让我提出一些我正在考虑的优点/缺点。

    独立: 专业版:

    • 如果您的 spring 应用程序以外的其他应用程序将使用 ActiveMQ,那么重新启动您的应用程序也会影响 ActiveMQ。不过,这里的情况似乎并非如此。

    • 反过来,如果正常运行时间很关键,您可以升级 ActiveMQ 安装而无需打开您的 spring 应用程序。

    单机缺点:

    • 更多需要考虑(另一个安装)来监控、操作等。

    如果这是一个内部应用程序,我喜欢嵌入式解决方案。 ActiveMQ 非常适合嵌入。如果您的应用程序需要扩展,您可以轻松地使用您的 spring 应用程序启动另一台服务器。并使用一行 XML 对 ActiveMQ 实例进行集群,然后就可以了。

    嵌入式解决方案的另一个优点是 Spring 和 ActiveMQ 之间的传输可以是 JVM 内部的,因此消息不会通过 TCP/IP 堆栈而是内存副本。这将加快您的应用程序。

    【讨论】:

      【解决方案2】:

      首先请注意,您的消息量非常小。您真的可以使用其中任何一个,并且最容易维护的可能会决定您的选择。

      扩展 Petter 关于重启的评论需要考虑的一件事是将连接到代理的其他机器的数量。

      客户

      如果您有 100 台机器连接到代理,那么每次重新启动带有嵌入式 ActiveMQ 的 Tomcat 都会中断 100 个需要重新连接的连接。 ActiveMQ 支持重新连接,因此可以正常工作,但是当每个人都重新连接时,它会给消息流增加一些不必要的延迟,有时几个客户端将无法重新连接,您必须手动将它们启动。

      使用一个独立的代理并假设有 100 个客户端,您可以根据需要随时重新启动 Tomcat 服务器,并且只断开从代理到 Tomcat 的一个连接。这可能非常好。

      如果您只有一个客户端(Tomcat 服务器本身),那么请直接嵌入并使用 in-vm 传输。

      内存

      另一个因素是内存。我们在 t1.micro 上使用 Amazon EC2 中的 ActiveMQ,它只有 613MB 的内存,非常小。运行两个 t1.micros(一个用于 ActiveMQ,一个用于 Tomcat)比同时运行一个 m1.small 更便宜。

      但同样,客户数量也是一个因素。如果除了 Tomcat 之外没有其他客户端,运行一个 m1.small 并将所有内容保存在同一个 vm 中可能会更好。

      仅供参考

      如果 Tomcat 和 ActiveMQ 是您的主要目标,您应该考虑Apache TomEE Plus,它是已经集成了 ActiveMQ 的 Tomcat。

      所有的罐子都在那里,默认情况下,一切都是使用 Petter 谈到的本地传输使用嵌入式 ActiveMQ 代理设置的。您也可以轻松地将其配置为使用standalone ActiveMQ broker。它还内置了JavaMail,听起来它可能对你有用。

      因此,您可以跳过设置部分,直接开始编写您的应用程序。例如,如果您要创建这个单个 Servlet 并将其置于没有其他 jar 或类的战争中,它会起作用:

      @WebServlet("/hello-world")
      public class MyServet extends HttpServlet {
      
          @Resource(name = "foo")
          private Topic fooTopic;
      
          @Resource(name = "bar")
          private Queue barQueue;
      
          @Resource
          private ConnectionFactory connectionFactory;
      
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //...
      
              Connection connection = connectionFactory.createConnection();
              connection.start();
      
              // Create a Session
              Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
      
              // Create a MessageProducer from the Session to the Topic or Queue
              MessageProducer producer = session.createProducer(fooTopic);
              producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
      
              // Create a message
              TextMessage message = session.createTextMessage("Hello World!");
      
              // Tell the producer to send the message
              producer.send(message);
      
              //...
          }
      
      }
      

      这里还有一个Getting Started Video,它显示了通过 Tomcat 适配器在 Eclipse 中进行设置。

      【讨论】:

        猜你喜欢
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        • 2016-03-25
        • 2014-01-11
        • 1970-01-01
        相关资源
        最近更新 更多