如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,怎么办?

提问者:帅平 问题分类:面试刷题
如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,怎么办?
2 个回答
影子爱人
影子爱人
可以使用Rabbitmq设置ttl,让消息时间失效,但是这里有一个坑:如果消息在 queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉,这个数据就没了,所以避免这个问题的解决思路是:
就是大量积压的时候,我们当时就直接丢弃数据了,然后等过了高峰期以后,比如大家一起喝咖啡熬夜到晚上12点以后,用户都睡觉了。这个时候我们就开始写程序,将丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入 mq 里面去,把白天丢的数据给他补回来。也只能是这样了。假设 1 万个订单积压在 mq 里面,没有处理,其中 1000 个订单都丢了,你只能手动写程序把那 1000 个订单给查出来,手动发到 mq 里去再补一次。
发布于:1周前 (04-21) IP属地:四川省
西瓜女皇
西瓜女皇
消息积压处理办法:临时紧急扩容,具体措施如下:
1、先修复 consumer 的问题,确保其恢复消费速度,然后将现有 cnosumer 都停掉。
2、新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。
3、然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。
4、接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。
5、这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据。
6、等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer 机器来消费消息。
发布于:1周前 (04-21) IP属地:四川省
我来回答