Kafka 消息堆积
Kafka 消息堆积(Backlog),是指:生产者持续写入,消费者处理速度赶不上写入速度,导致消息在 Topic 分区中堆积。
表现形式为:
比如:消费端延迟上升;
以及,Broker磁盘空间持续增长;
以及,ConsumerLag(消费位移差)不断扩大。
在极端情况下,严重的资源耗尽或系统不稳定可能导致消息队列、或流处理平台发生故障,增加数据丢失的风险。
因此,及时发现、诊断和解决消息堆积问题,对于保障系统的正常运行至关重要。
如何处理消息堆积?
方案一:扩容消费者实例(快速解法)
通过增加消费者实例数量,提升消费并发能力,让更多线程/进程同时拉取消息,尽快“追平”堆积数据。
比如:
-
启动更多消费者进程或容器实例;
-
确保它们在同一个 Consumer Group 中;
-
Kafka 会自动将分区重新分配给新增消费者实例。
适用场景:
-
临时应急处理积压;
-
消费逻辑简单,IO 快;
-
可以临时水平扩容服务。
总之,增加消费者数量 → 提升消费并发能力,前提:分区数足够多(否则无效)。
✅ 方案二:优化消费逻辑
提升每个消费者的处理能力,降低每条消息的消费耗时,提升整体消费吞吐。
比如:
1️⃣ 异步化慢操作
把写数据库、HTTP 请求等 IO 操作交给异步线程或缓冲队列;
主线程快速 ack offset,避免堵塞。
将消费数据放入 BlockingQueue,后台线程批量写入 MySQL。
2️⃣ 使用线程池并发处理
避免每条消息串行消费;
消费线程只是转发消息给线程池,后者并发处理。
ExecutorService.submit(() -> handleMessage(msg))
✅ 方案三:提升分区数,提升并行度
Kafka 分区 = 消费并发的最大单位,增加 Topic 的分区数,相当于增加了“并行处理通道”。
kafka-topics.sh --alter --topic your-topic --partitions 12 --bootstrap-server localhost:9092
这里需要,合理设计 topic 分区数(>= 期望并发数)。
总之,根据具体的场景和瓶颈点,可以采取相应的策略组合,会更有效地解决消息堆积问题。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》