springboot +activeMQ 多线程消费慢问题

环境 

springboot 1.5.1.RELEAS

activemq 5-15.19

问题描述

在直接使用springboot 中jmsMessagingTemplate直接接收消息队列的内容的时候,会发现消息接收很慢,在10个线程左右时,接收一个消息大概是至少需要一百毫秒,在30个线程的时候需要500ms。

问题分析

通过网上资料的查阅,发现了多线程情况下,消息消费慢的问题,很可能是跟spring与jmsTemplate与activemq的prefetch机制导致的问题(jmsMessagingTemplate是对jmsTemplate的封装,底层还是jmsTemplate)。jmsTemplate实现的机制是,每次调用receive都会创建一个customer对象,用完即销毁。正常情况下,重复创建的customer并不会导致如此巨大的时延,主要原因是activeMQ的prefetch机制。

prefetch机制,每次customer连接至于mq的时候,会预存小message到消费者,预存放message的数量取决于prefetchSize(默认是1000),此机制在同一个客户端反复进行receive操作的时候,能够提高出队的性能。但是实际情况是,每次jmsTemplate.receive()都会产生1000个消息的网络流量,但是jmsTemplate并不会重复利用customer,导致了后面999个消息被废弃。反复调用jms.receive()时,不仅会增加时延,而且还会造成网络带宽大量的浪费。

问题解决方法(应该可以优化)

通过使用下面的方法,30个线程并发取数的情况,基本耗时都是在10ms左右,但是偶尔会出现耗时很长的情况,具体原因未知,但是基本上30个线程每个线程1000个请求的平均响应时间都在100ms(包含业务处理时间),在未处理之前的平均响应时间是500ms以上。所以可以说效果还是比较明显的。

 我的application.properties

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=true
#如果此处设置为true,需要加如下的依赖包,否则会自动配置失败,报JmsMessagingTemplate注入失败
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=30
@Configuration
public class ActiveMQConnectionConfig {

    @Bean
    public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory){
        ActiveMQConnectionFactory connetionFactory = null;
        if(connectionFactory instanceof  ActiveMQConnectionFactory){
            connetionFactory = (ActiveMQConnectionFactory) connectionFactory;
        }else if(connectionFactory instanceof  PooledConnectionFactory){
             connetionFactory = (ActiveMQConnectionFactory) ((PooledConnectionFactory) connectionFactory).getConnectionFactory();
        }

        ActiveMQPrefetchPolicy activeMQPrefetchPolicy = new ActiveMQPrefetchPolicy();
        activeMQPrefetchPolicy.setQueuePrefetch(1);
        connetionFactory.setPrefetchPolicy(activeMQPrefetchPolicy);
        JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(connectionFactory);
        // jmsTemplate.setSessionTransacted(true);
        return jmsTemplate;
    }

}

鸣谢

感谢这位博主的文章

https://www.cnblogs.com/baibaluo/archive/2012/12/24/2748468.html

你可能感兴趣的:(JAVA,ActiveMQ)