上一篇我们主要说如何防止mq的消息丢失,这一篇主要是讲如何处理消息堆积。
其实好多时候消息堆积的解决方法都是因业务而议的。而我们这边也是通过发现生产环境出现了问题,而进行排查的,然后解决的。当然每个项目的业务场景不一样。然后解决方式也不一样,但是基本上都是在这方面解决的。
首先我们得知道为什么会产生消息堆积?
1、消息发送的速率远远大于消息消费的速率。
2、消费者出现了问题,导致无法消费。
其实基于上面两个原因,我们基本上第二个可以不用考虑,因为第二个原因基本上不会在生产环境出现。所以我们主要考虑第一个原因。

消息发送的速率远远大于消息消费的速率。我们知道如果并发一高,这个时候消息产生的速度会很快,但是由于我们处理消息的能力(数据库或者其他东西)有限,无法一下子处理这么多消息。这个时候就会出现消息堆积。而消费者消费的速度跟不上。
这个时候我们可以通过增加机器来解决这个问题,但是不可能一直增加机器吧,只有当我们的代码进行了最大优化的时候,才会考虑扩展机器,毕竟公司不大,为了节约成本。
所以我们只能采用mq内部的方式去增大消费者的速度。因此我们需要知道两个参数属性:
1、concurrentConsumers
2、prefetchCount
concurrentConsumers设置的是对每个listener在初始化的时候设置的并发消费者的个数。
prefetchCount是每次一次性从broker里面取的待消费的消息的个数。prefetchCount是BlockingQueueConsumer内部维护的一个阻塞队列LinkedBlockingQueue的大小,其作用就是如果某个消费者队列阻塞,就无法接收新的消息,该消息会发送到其它未阻塞的消费者
如果我们想增大消费者的速度,可以通过配置者两个参数来进行,如下所示

spring.rabbitmq.listener.simple.concurrency: 最小的消费者数量
spring.rabbitmq.listener.simple.max-concurrency: 最大的消费者数量
spring.rabbitmq.listener.simple.prefetch: 指定一个请求能处理多少个消息,如果有事务的话,必须大于等于transaction数量.

配置完后,我们发现确实速度提高了不少。当然并不是越大越好呢。具体大小还得根据你项目的业务量来确定。