MQ面试场景题

MQ面试场景题
mengnankkzhou场景题
1.如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
问题分析:
1.大量的消息在MQ里积压了
2.MQ中的消息过期失效了
3.MQ的队列快满了
第一个问题:
消息在MQ大量积压是消费者和生成者生产消费的速度差距过大
消费者消费的少,生产者生产的多
那么我们就先修复消费者的问题,确保消费者都能使用
然后紧急扩容,新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。
写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。
临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据。
然后恢复原先的架构
或者是业务支持批量发送的时候,使用批量发送
或者是跳过非重要的消息,
1 | public ConsumeConcurrentlyStatus consumeMessage( |
或者优化消息的处理步骤,比如需要查两次,写两次,可以合并为查/写一次完成
第二个问题:
RabbitMQ,RabbtiMQ 是可以设置过期时间的,也就是 TTL。如果消息在 queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉,这个数据就没了。
我们丢了大量的数据,没办法,我们只能等队列比较少的时候。人工的去找出少了哪些数据,然后人工恢复数据
我们可以先访问RabbitMQ 自带的管理界面提供队列长度、消息速率等基本监控信息
默认端口15672,查看目标队列的 “Messages ready” (就绪消息数量) 和 “Messages unacknowledged” (未确认消息数量)。 如果 “Messages ready” 持续增长,说明队列存在积压。
第三个问题:
mq快写满了,我们可以直接丢弃,然后再补数据了只能