一、上千万条消息在mq中积压了⼏个⼩时还没解决:
1)先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉;
2)新建⼀个topic,partition是原来的10倍,临时建⽴好原先10倍或者20倍的queue数量;
3)然后写⼀个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据;消费之后不做耗时的处理,直接均匀轮询写⼊临时建⽴好的10倍数量的queue;
4)接着临时征⽤10倍的机器来部署consumer,每⼀批consumer消费⼀个临时queue的数据;
5)这种做法相当于是临时将queue资源和consumer资源扩⼤10倍,以正常的10倍速度来消费数据;
6)等快速消费完积压数据之后,得恢复原先部署架构,重新⽤原先的consumer机器来消费消息。
总结:
1. 修复并停掉consumer;
2. 新建⼀个topic,partition是原来的10倍,建⽴临时queue,数量是原来的10倍或20倍;
3. 写临时consumer程序,临时征⽤10倍的机器去消费数据;
4. 消费完成之后,恢复原先consumer;
二、rabbitmq设置过期时间,部分消息丢失:
采取批量重导⽅法:将丢失的那批数据查询导⼊到mq⾥⾯。
三、RabbitMQ 上的⼀个 queue 中存放的 message 是否有数量限制?
可以认为是⽆限制,因为限制取决于机器的内存,但是消息过多会导致处理效率的下降。
四、分布式部署:
RabbitMQ⽆法容忍不同数据中⼼之间⽹络延迟,但是可以通过3种⽅式实现分布式部署:Federatio和Shovel。
5、如何确保消息正确地发送⾄RabbitMQ?
RabbitMQ使⽤发送⽅确认模式,确保消息正确地发送到RabbitMQ。
发送⽅确认模式:将信道设置成confirm模式(发送⽅确认模式),则所有在信道上发布的消息都会被派⼀个唯⼀的ID。⼀旦消息被投递到⽬的队列后,或者消息被写⼊磁盘后(可持久化的消息),信道会发送⼀个确认给⽣产者(包含消息唯⼀ID)。如果RabbitMQ发⽣内部错误从⽽导致消息丢失,会发送⼀条nack(not acknowledged,未确认)消息。发送⽅确认模式是异步的,⽣产者应⽤程序在等待确认的同时,可以继续发送消息。当确认消息到达⽣产者应⽤程序,⽣产者应⽤程序的回调⽅法就会被触发来处理确认消息