ActiveMQ消息挤压导致死信(预取机制导致)

young 419 2022-05-19

现象:

生产出现队列堆积并有队列超时进入死信,Producer发送消息后,consumer在30~90秒后才收到请求开始处理。

原因:

在多个消费者消费同一个队列的情况下,mq有几率将所有消息都交给一个消费者消费。出现忙的忙死,闲的闲死的情况

解决方案:

mq默认预取消息数量=1000,限制每个消费者的预取消息数量,平均每个消费者的消费数量。
如果一个消费者预取了18条消息,那么这18条消息只能由这个消费者来消费,超时时间为90秒,一条消息的消费时间约为5秒,18*5=90秒,所以预取消息数量不能大于18条。
将mq的queuePerfetch设置为10.

<bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
  	<property name="queuePrefetch" value="10"/>
</bean>
<bean id="jmsConnectionFactory" class="bis.framework.config.MqConnectionFactory">
		<property name="trustAllPackages" value="true"/>
  	<property name="prefetchPolicy" ref="prefetchPolicy"/>
</bean>