Kafka消息积压问题排查与解决方案
先搞清楚为什么会积压
面试官问你Kafka消息积压怎么解决,其实他想看的是你有没有真正处理过这种问题,能不能分析出问题的根源。所以咱们先得搞清楚,消息为啥会积压。
说白了,消息积压就是生产的速度比消费的速度快,消息在Broker里越攒越多。就像你家门口堆快递,送的比你拆的快,时间一长门口就堆满了。
消费端处理太慢
这是最常见的原因,消费者那边处理消息的速度跟不上。一般有这么几种情况:
业务逻辑太重了
你想啊,每条消息过来,你要查数据库、调第三方接口、写日志、发通知,一套流程下来几百毫秒甚至几秒,消息不积压才怪。我之前遇到过一个case,消费一条消息要调三个外部服务,其中一个服务响应特别慢,直接把整个消费链路拖垮了。
下游服务挂了或者变慢了
消费逻辑里调用的数据库、Redis、第三方接口如果响应变慢或者直接挂了,消费速度立马就下来了。这种情况下消费者可能还在不停地重试,CPU和网络都在空转,但就是消费不动。
消费者线程太少
Kafka消费者默认是单线程拉取消息的,如果你业务处理也是单线程,那处理能力就很有限。有的团队图省事,一个消费者实例就起一个线程处理消息,分区数设了10个,但只有一个消费者实例,那9个分区就相当于闲置了。
代码写得有问题
比如每条消息都去建数据库连接,用完不释放;或者有内存泄漏导致频繁GC;甚至有死锁、线程阻塞这种问题。这些bug平时流量低的时候看不出来,一上量就暴露了。