【ActiveMQ 求助】消费者的速度远远更不上啊,大神来帮助一下

其人如玉 2014-01-06 05:25:44
加精
小菜一只,上面安排优化ActiveMQ的配置。。。我到处瞎鼓捣,现在发送者的速度贼快达到 5000条/s
可是消费者的速度太慢了,而且在后台查看,1000条消息只被消费了94条。我勒个去啊,那么多被积压啊。。。我把导出一个jar包当做消费者运行,这样就不会积压,但是速度是 15条/s 这大坑...

我看了网上许多资料,说采用两个连接池来区分。。

求大神给个思想怎么优化消费者的速度,下面上配置:
ActiveMQ.xml

<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.brokerURL}" />
<property name="userName" value="${jms.username}" />
<property name="password" value="${jms.password}" />
<property name="dispatchAsync" value="true" />
<property name="useAsyncSend" value="true" />
</bean>

<!-- 设置发送连接池,提高性能 -->
<bean id="JmsSenderFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory" ref="jmsFactory" />
<property name="maxConnections" value="100"></property>
</bean>

<!-- 设置接收连接池,提高性能 -->
<bean id="JmsReveiverFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="connectionFactory" ref="jmsFactory" />
<property name="maxConnections" value="100"></property>
</bean>

<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="JmsSenderFactory" />
<property name="defaultDestination" ref="destination" />
<!-- 区别它采用的模式:false是p2p;true是订阅 -->
<property name="pubSubDomain" value="false" />
<property name="messageConverter">
<bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
</property>

</bean>

<!-- Spring JMS Template -->
<bean id="jmsTemplate2" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="JmsReveiverFactory" />
<property name="defaultDestination" ref="destination" />
<!-- 区别它采用的模式:false是p2p;true是订阅 -->
<property name="pubSubDomain" value="false" />
<property name="messageConverter">
<bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
</property>

</bean>




<!-- 发送消息的目的地(一个队列) -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<!-- 设置消息队列的名字 -->
<constructor-arg index="0" value="${jms.queueName}" />
</bean>

<!-- 消息监听 -->
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="concurrentConsumers" value="${jms.concurrentConsumers}" />
<property name="connectionFactory" ref="JmsReveiverFactory" />
<property name="destinationName" value="${jms.queueName}" />
<property name="messageListener" ref="messageConsumer" />
<property name="sessionTransacted" value="true"/>
<property name="pubSubNoLocal" value="true"></property>
</bean>

<!-- 消息消费者 -->
<bean id="messageConsumer"
class="com.voole.jms.MessageConsumer">
<property name="jmsTemplate2" ref="jmsTemplate2"></property>
</bean>

<!-- 消息生产 -->
<bean id="messageProducer"
class="com.voole.jms.MessageProducer">
<property name="jmsTemplate" ref="jmsTemplate"></property>
</bean>
</beans>


就不发到中间件了,我估计这儿的人多点。。。没多少分了,求大神解惑~小弟感激不尽。
...全文
9614 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
匠心零度 2015-09-02
  • 打赏
  • 举报
回复
提高消费者代码里面实现逻辑才是王道!
光西 2015-05-27
  • 打赏
  • 举报
回复
请问你的的生产者 是如何 做到5000/s的? 还厉害
sd4324530 2014-09-01
  • 打赏
  • 举报
回复
引用 18 楼 z6165039 的回复:
[quote=引用 13 楼 sd4324530 的回复:] 如果你之前的消费者是处理完业务逻辑后才返回,可以尝试下这种优化方式: 消费者在刚拿到消息后,直接把消息放入另一个队列,然后立刻返回等待下次消费,而那个消息队列通过另一个线程池去不停的获取消息进行业务处理,这样,可以是消费者响应速度大幅提升
开线程去处理业务,貌似不是好办法。。。。因为处理业务有频繁的去相同的表插入数据。。。猜测这样很可能导致数据库死锁。。。觉得不太实用。。[/quote] 多线程插表如果就会死锁的话,那高并发的项目还能活吗- -
z6165039 2014-08-27
  • 打赏
  • 举报
回复
引用 13 楼 sd4324530 的回复:
如果你之前的消费者是处理完业务逻辑后才返回,可以尝试下这种优化方式: 消费者在刚拿到消息后,直接把消息放入另一个队列,然后立刻返回等待下次消费,而那个消息队列通过另一个线程池去不停的获取消息进行业务处理,这样,可以是消费者响应速度大幅提升
开线程去处理业务,貌似不是好办法。。。。因为处理业务有频繁的去相同的表插入数据。。。猜测这样很可能导致数据库死锁。。。觉得不太实用。。
z6165039 2014-08-27
  • 打赏
  • 举报
回复
我也遇到这个问题。。。。。。。请问楼主解决了否???
wxk008 2014-05-26
  • 打赏
  • 举报
回复
<property name="pubSubDomain" value="true" /> 采用订阅方式 , 监听器发部到多个机器上。 会分解一些压力
正与邪的对抗 2014-02-21
  • 打赏
  • 举报
回复
知行合一永胜 2014-02-20
  • 打赏
  • 举报
回复
路过太专业了啊
sd4324530 2014-02-18
  • 打赏
  • 举报
回复
如果你之前的消费者是处理完业务逻辑后才返回,可以尝试下这种优化方式: 消费者在刚拿到消息后,直接把消息放入另一个队列,然后立刻返回等待下次消费,而那个消息队列通过另一个线程池去不停的获取消息进行业务处理,这样,可以是消费者响应速度大幅提升
etnet 2014-02-17
  • 打赏
  • 举报
回复
我也碰到过同样的问题,使用JMS来远程调用出现慢速消费者的问题. 我是这样解决的,消费者我只生成一个,这个消费者统一的来拿取消息. 首先我建立了这样一个类.

private static class MessageProbe {

        private Object returnValue;
        private CountDownLatch latch = new CountDownLatch(1);

        public Object await() throws InterruptedException {
            latch.await();
            return returnValue;
        }

        public Object await(long timeout)
                throws InterruptedException, TimeoutException {
            boolean noTimeout = false;
            noTimeout = latch.await(timeout, TimeUnit.MILLISECONDS);
            if (noTimeout) {
                return returnValue;
            } else {
                throw new TimeoutException("Response message timed out.");
            }
        }

        public void obtainRetunValue(Object value) {
            returnValue = value;
            latch.countDown();
        }
    }
发出调用请求后我就生成一个"MessageProbe"的实例,然后交给之前生成的消费者. 我的每一次调用都会有一个唯一标识,就是根据这个标识来区分消费.

Map<String, MessageProbe> registerPool =
            new ConcurrentHashMap<String, MessageProbe>();
一个简单的JDK5提供的Map实现,就能满足消费者持有这些"MessageProbe"实例的要求了. 接收到消息,查看自定义属性中的消息标识,根据这个标识找到"MessageProbe",然后调用"obtainRetunValue"方法为其注入消息. 调用线程只需要阻塞在MessageProbe.awit()方法上即可.
guttag 2014-02-17
  • 打赏
  • 举报
回复
如果是项目的要求的话,应该根据业务逻辑确定性能需求。只要满足需求就可以了。否则优化就是一个无底洞了
guttag 2014-02-17
  • 打赏
  • 举报
回复
先查看一下你消费者的逻辑和性能吧,如果本身的性能很差,在jms这一层上优化余地有限.如果你的消费者什么操作都没有,应该不会那么慢的。
晓风吹雾 2014-02-14
  • 打赏
  • 举报
回复
如果事物长时间占用,减少事物超时的时间,尽快的消费掉。能够让接下去的任务到达。 transactionTimeout
晓风吹雾 2014-02-14
  • 打赏
  • 举报
回复
消费者可是设置并行的消费数,也就是再并行同一时间消费的数量。默认好像是5,具体可以自己调整。 mdb中的maxSession字段
zyr987503101 2014-02-14
  • 打赏
  • 举报
回复
不知道,略过、、、
致知Fighting 2014-02-13
  • 打赏
  • 举报
回复
如何提升消费者的速度,取决于消费者的逻辑,我给你这样的消费者逻辑: public void run() { Thread.sleep(100000); } 你把框架折腾烂了都无法改善你消息堆积的情况
xuliduo 2014-02-13
  • 打赏
  • 举报
回复
你确定你的消费者那部分代码能高速消费?
其人如玉 2014-01-07
  • 打赏
  • 举报
回复
引用 2 楼 panzhixiong_cn 的回复:
有点看不懂你提出的问题啊,难道我水平不够?期待真正的高手。
就是如何提升消费者的速度~~~
panzhixiong_cn 2014-01-07
  • 打赏
  • 举报
回复
有点看不懂你提出的问题啊,难道我水平不够?期待真正的高手。
其人如玉 2014-01-06
  • 打赏
  • 举报
回复
大神们,给个思路吧。。。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧