写点什么

消息队列(六)如何处理消费者故障导致的百万消息积压?

用户头像
奈何花开
关注
发布于: 2020 年 06 月 30 日

我们先思考一下导致消息队列消息百万积压都是怎么造成的。首先,可能是消费端出问题了,比如宕机等情况,或者消费端消费突然变得极慢,就会导致消息不断积压;也有可能是消费端依赖的服务器挂掉了,比如依赖的 NoSQL/MySQL 挂掉了,导致消费者自己没法正常运作了,导致消息的积压。

怎么解决百万消息积压问题?

如果积压的这些消息是允许丢失的,那么很简单,马上修改消费者代码直接丢弃消息即可,这个速度会很快,所以积压消息处理起来也非常地迅速。


但是往往来说,很多消息都是不允许直接丢弃的。所以我们还是需要快速地处理,怎么快速地处理呢?最简单高效的办法就是临时部署足够多的消费者,一起来消费这些消息。当然,在此之前,需要先恢复系统的正常服务。


比如对于 RocketMQ 来说,原本一个 Topic 只有 4 个 MessageQueue,对应 4 个消费者。很明显如果消息积压了百万条,那么 4 个消息消费是不能够快速处理掉这一批积压消息的。我们可以修改 4 台原消费者代码,不直接处理消息,而是先把消息发送到一台新的 RocketMQ 中,这台新的 RocketMQ 一个 Topic 有 20 个 MessageQueue,这时我们可以临时部署 20 个消费者一起消费这批数据,消息的消费速度提高了 5 倍,很快积压的百万消息都会被处理完毕。处理完积压的消息之后就可以下线临时部署的 20 台消费者了。



用户头像

奈何花开

关注

还未添加个人签名 2019.05.14 加入

还未添加个人简介

评论 (2 条评论)

发布
用户头像
最后的压力都转向DB了
2020 年 07 月 09 日 19:46
回复
MQ 的消息不会全是DB操作的,还有比如短信发送之类的异步调用等。当然,消费者数量增加肯定会增加 DB 的压力,需要注意 DB 的抗压能力,这个数量需要根据实际来调整
2020 年 07 月 09 日 22:51
回复
没有更多了
消息队列(六)如何处理消费者故障导致的百万消息积压?