消息堆积处理建议
方案概述
Kafka将Topic划分为多个分区,消息被分布式存储在分区中。同一个消费组内,一个消费者可同时消费多个分区,但一个分区在同一时刻只能被一个消费者消费。
在消息处理过程中,如果客户端的消费速度跟不上服务端的发送速度,未处理的消息会越来越多,这部分消息就被称为堆积消息。消息没有被及时消费就会产生消息堆积,从而会造成消息消费延迟。
消息堆积原因
导致消息堆积的常见原因如下:
- 生产者短时间内生产大量消息到Topic,消费者无法及时消费。
- 消费者的消费能力不足(消费者并发低、消息处理时间长),导致消费效率低于生产效率。
- 消费者异常(如消费者故障、消费者网络异常等)导致无法消费消息。
- Topic分区设置不合理,或新增分区无消费者消费。
- Topic频繁重平衡导致消费效率降低。
实施步骤
从消息堆积的原因看,消息堆积问题可以从消费者端、生产者端和服务端三个方面进行处理。
- 消费者端
- 根据实际业务需求,合理增加消费者个数(消费并发度),确保分区数/消费者数=整数,建议消费者数和分区数保持一致。
- 提高消费者的消费速度,通过优化消费者处理逻辑(减少复杂计算、第三方接口调用和读库操作),减少消费时间。
- 增加消费者每次拉取消息的数量:拉取数据/处理时间 >= 生产速度。
- 生产者端
生产消息时,给消息Key加随机后缀,使消息均衡分布到不同分区上。
在实际业务场景中,为消息Key加随机后缀,会导致消息全局不保序,需根据实际业务判断是否适合给消息Key加随机后缀。
- 服务端
- 合理设置Topic的分区数,在不影响业务处理效率的情况下,调大Topic的分区数量。
- 当服务端出现消息堆积时,对生产者进行熔断,或将生产者的消息转发到其他Topic。