ActiveMQ请求/回复模式:以下哪种方法被认为是良好的性能?

时间:2017-01-10 15:10:34

标签: java session design-patterns activemq synchronous

以下是我正在使用的两种方法,请帮助我了解哪一种更好!它是一个同步过程。

方法1 :(不关闭任何连接对象)

  

在下面的类中创建了connectionfactory并维护该类的池

ConnectionPool.java(使用代理URL维护不同生产者的池)

private static Map<String, Producer> producers
public static ProducerPool getInstance() {
        if(INSTANCE==null){
            producers = Maps.newConcurrentMap();
            INSTANCE= new ProducerPool();
        }
        return INSTANCE;
    }

Producer.java(此处创建的所有连接对象)

private ActiveMQConnection connection;
private ActiveMQSession session;
private MessageProducer producer;
return consumer.receive(5000);

因此,如果100 req也来了,它将只维护一个连接,生产者,会话。

方法2:

  

(关闭所有连接,会话,每个请求的生产者而不是单身)

方法3:

  

(仅保持连接活动并按每个请求关闭会话和生成器,并重新创建每个请求关闭的相同内容)

哪种方法可以获得更高的性能?在请求回复模式最高级别哪一个(连接r会话r生产者)我们可以重用? 瞥了一眼:(任何人都可以帮忙举例说明如何使用它!)

  

PooledConnectionFactory

请帮助应该遵循哪一个!

1 个答案:

答案 0 :(得分:0)

如果不对将在生产中使用的相同系统配置进行性能测试,则无法回答这个问题。确定最佳性能的因素太多。例如,要确定代理配置,您需要验证以下内容:

  • CPU数量?
  • 内存量?
  • 网卡接口数量?
  • 用于存储后端的磁盘安装数量?
  • 使用的队列数量?
  • 生产者数量?
  • 消费者数量?
  • 邮件大小?
  • 消息量(msg / s)?

消息传递的最佳做法是预先调整。我进入的大多数客户实际上并没有高消息量。首先尝试简单的单连接,单个会话和单个生成器。如果它符合您的性能要求,那么关注的是将HA和监控指标放在一边。实现这些目标可以获得更高的回报,并且可以获得更稳定的消息传递平台,而不是试图调整另外5-10%的性能提升。

请记住:大多数邮件系统都会受到代理磁盘速度的限制,因此在客户端缓存对象只会在某些边缘情况下受益。