跳到主要内容

Kafka消息积压问题排查与解决方案

先搞清楚为什么会积压

面试官问你Kafka消息积压怎么解决,其实他想看的是你有没有真正处理过这种问题,能不能分析出问题的根源。所以咱们先得搞清楚,消息为啥会积压。

说白了,消息积压就是生产的速度比消费的速度快,消息在Broker里越攒越多。就像你家门口堆快递,送的比你拆的快,时间一长门口就堆满了。

消费端处理太慢

这是最常见的原因,消费者那边处理消息的速度跟不上。一般有这么几种情况:

业务逻辑太重了

你想啊,每条消息过来,你要查数据库、调第三方接口、写日志、发通知,一套流程下来几百毫秒甚至几秒,消息不积压才怪。我之前遇到过一个case,消费一条消息要调三个外部服务,其中一个服务响应特别慢,直接把整个消费链路拖垮了。

下游服务挂了或者变慢了

消费逻辑里调用的数据库、Redis、第三方接口如果响应变慢或者直接挂了,消费速度立马就下来了。这种情况下消费者可能还在不停地重试,CPU和网络都在空转,但就是消费不动。

消费者线程太少

Kafka消费者默认是单线程拉取消息的,如果你业务处理也是单线程,那处理能力就很有限。有的团队图省事,一个消费者实例就起一个线程处理消息,分区数设了10个,但只有一个消费者实例,那9个分区就相当于闲置了。

代码写得有问题

比如每条消息都去建数据库连接,用完不释放;或者有内存泄漏导致频繁GC;甚至有死锁、线程阻塞这种问题。这些bug平时流量低的时候看不出来,一上量就暴露了。