ActiveMQ独立服务器部署或嵌入在Spring Webapp中

时间:2012-06-22 13:32:17

标签: java-ee jms activemq setup-deployment

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

来做到这一点

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

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

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

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

  4.   
  5. 单独的ActiveMQ服务器/嵌入式服务器有哪些优点/缺点?

  6.   

2 个答案:

答案 0 :(得分:7)

首先请注意,随着时间的推移,您的消息量非常小。你可以真正使用其中任何最容易维护的东西可能会决定你的选择。

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

客户

如果你有100台机器连接到代理,那么每次重启Tomcat w / embedded ActiveMQ都会破坏所有需要重新连接的100个连接。 ActiveMQ支持重新连接,因此可以很好地工作,但它可以为每个人重新连接时添加一些不必要的消息流延迟,有时一些客户端将无法重新连接,您必须手动将它们付诸行动。

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

如果您只有一个客户端 - Tomcat服务器本身 - 那么请放下嵌入式并使用in-vm传输。

内存

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

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

FYI

如果Tomcat和ActiveMQ是您的主要目标,您应该考虑使用已集成ActiveMQ的Tomcat Apache TomEE Plus

所有的罐子都在那里,默认情况下使用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中设置它。

答案 1 :(得分:4)

如果负载很高或很难说很难说。它实际上取决于消息的大小以及是否使用持久性消息和事务。假设他们只有几个10KB,你应该用一台服务器做得很好。

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

独自站立: Pro独立:    - 如果你有其他应用程序而不是你的应用程序将起诉ActiveMQ,那么重启你的应用程序也会影响ActiveMQ。但这似乎并非如此。

  • 反过来说,如果正常运行时间很重要,您可以在不转动弹簧应用的情况下升级ActiveMQ安装。

缺点:独立:   - 更多考虑(另一个安装)来监控,操作等。

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

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