1.堆积原因
主要的问题有两个,第一个原因在于消费者消费消息的速度低于生产者的生产速度,其次消费者存在问题无法对消息进行消费
2.解决的思路
根据堆积的原因我们可以我们有两种思路,其中第一种就是去限制生产者的消息生产速度,另一种就是去提高消费者的消费能力。
2.1 限制生产者的生产速度
这种处理方法几乎是不可能的,也不现实的。例如在电商场景,某一个时间点如果有活动可能会导致消息过多的情况,但是这是正常的业务场景,我们没办法去限制这个现象。
2.2 提高消费者的消费速度
但消息积压严重的时候,我们需要去诊断消费者的消费能力是否正常;在消费者能力正常的情况下,我们可以在RabbitMQ建立一个临时的队列,同时写一个消费程序不涉及消费逻辑,将原先队列中的消息转发到临时的队列中,同时借调多台临时的服务器对临时队列中的消息进行消费。以此来提高消费能力。
需要注意的问题是:RabbitMQ默认是Pull的模式,即是RabbitMQ会主动将消息推送给消费者,而消费者会采用一个缓存进行保存消息,如果我们不加以限制,大量的消息也会堆积在RabbitMQ消费者的缓存中,导致占用过多内存,可能会导致进程下线的问题。所以我们可以通过basicQOS来限制RabbitMQ推送消息的数量。
2.3错峰处理
有时若没有临时服务器的资源可以临时借调,我们可以利用为消息队列绑定死信队列,同时为消息设置过期时间;当消息过时未处理的时候自动将消息传入死信队列中,我们对进入死信队列的消息可以先存入数据库等高峰过去之后再次进行处理(也有其他的处理方式)
2.4 多线程消费
在Spring Boot中的RabbitMQ默认采用的是单线程串行处理的方法,我们可以通过设置多个线程同时进行消费来提高消息的消费能力
标签:消费,消费者,队列,RabbitMQ,死信,消息,堆积 From: https://www.cnblogs.com/zhengjiafu-log/p/17461095.html