一、消息堆积在什么业务场景情况下会出现:
1、消息发送的速率远远大于消息消费的速率。
在实际应用场景中什么情况下消息发送的速率远远大于消息消费的速率,比如某个时间段消费端处理消息异常缓慢(发送消息只要3秒钟,而消费消息需要1分钟左右才能处理一个消息,每分钟发送20个消息,只能有一个消息被消费端处理,这样队列中就会产生大量的消息堆积)
二、如何优化消费端处理缓慢造成的消息堆积问题
默认情况下,rabbitmq消费者为单线程串行消费,这也是队列的特性。源码在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer中可见:
当消费端处理缓慢造成的消息堆积就可以通过设置并发消费提高消费的速率,从而减少消息堆积的问题。
三、设置并发消费两个关键属性concurrentConsumers和prefetchCount
concurrentConsumers设置的是对每个listener在初始化的时候设置的并发消费者的个数,prefetchCount是每次一次性从broker里面取的待消费的消息的个数,从源码中分析org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer:启动的时候会根据设置的concurrentConsumers创建N个BlockingQueueConsumer(N个消费者)。
prefetchCount是BlockingQueueConsumer内部维护的一个阻塞队列LinkedBlockingQueue的大小,其作用就是如果某个消费者队列阻塞,就无法接收新的消息,该消息会发送到其它未阻塞的消费者
以上是在生产环境中对于偶尔某个时间段出现消费异常缓慢提出的一些优化方案,经过实际检测对于消息堆积的问题减少效果还是比较好的。
网友评论