一、问题
发送信息到交换机后,会发到两个队列(每个队列有4个消费者),消息较为均匀的分给4个消费者处理。如下图:(为0的那个是无关的队列)
此时强行关闭服务器,会有一部分Unacked的消息没有得到处理,回到队列中。
然后再重新启动服务器,此时消息会全部堆积到一个消费者身上,另外三个消费者没有获取到消息。(正常来说应该均匀的分给四个消费者)
二、原因
这是因为在重启服务器后,线程并不是同时打开的,而是一个一个打开的。第一个打开的线程对应的消费者将会把全部的消息都获取了,导致其他通道打开之后没有消息可以获取。由于默认的上限是250,积压的消息没有达到上限,所以全部都推给了一个消费者了。
三、解决方法
给单个消费者设置未确认消息的上限,这样第一个启动的消费者揽下的消息达到上限后,就不会再接受。当其他消费者线程启动后,就可以正常分担消息。
设置配置文件spring.rabbitmq.listener.simple.perfetch=10即可。
重写启动服务器,如下:
Prefetch全部都为10,然后每个消费者的Unacked都不超过10了。