消息队列(六)如何处理消费者故障导致的百万消息积压?
我们先思考一下导致消息队列消息百万积压都是怎么造成的。首先,可能是消费端出问题了,比如宕机等情况,或者消费端消费突然变得极慢,就会导致消息不断积压;也有可能是消费端依赖的服务器挂掉了,比如依赖的 NoSQL/MySQL 挂掉了,导致消费者自己没法正常运作了,导致消息的积压。
怎么解决百万消息积压问题?
如果积压的这些消息是允许丢失的,那么很简单,马上修改消费者代码直接丢弃消息即可,这个速度会很快,所以积压消息处理起来也非常地迅速。
但是往往来说,很多消息都是不允许直接丢弃的。所以我们还是需要快速地处理,怎么快速地处理呢?最简单高效的办法就是临时部署足够多的消费者,一起来消费这些消息。当然,在此之前,需要先恢复系统的正常服务。
比如对于 RocketMQ 来说,原本一个 Topic 只有 4 个 MessageQueue,对应 4 个消费者。很明显如果消息积压了百万条,那么 4 个消息消费是不能够快速处理掉这一批积压消息的。我们可以修改 4 台原消费者代码,不直接处理消息,而是先把消息发送到一台新的 RocketMQ 中,这台新的 RocketMQ 一个 Topic 有 20 个 MessageQueue,这时我们可以临时部署 20 个消费者一起消费这批数据,消息的消费速度提高了 5 倍,很快积压的百万消息都会被处理完毕。处理完积压的消息之后就可以下线临时部署的 20 台消费者了。
评论 (2 条评论)