分布式消息服务Kafka

消息堆积最佳实践

2024-05-08 09:07:52

方案概述

Kafka将Topic划分为多个分区,消息被存储在不同的分区中。在同一个消费组内,一个消费者可同时消费多个分区,但一个分区在同一时刻只能被一个消费者消费。

                                             

在消息处理过程中,如果客户端的消费速度跟不上服务端的发送速度,未处理的消息会越来越多,这部分消息就被称为堆积消息。消息没有被及时消费就会产生消息堆积,从而会造成消息消费延迟。

导致消息堆积的常见原因如下:

l  生产者短时间内生产大量消息到Topic,消费者无法及时消费。

l  消费者的消费能力不足(消费者并发低、消息处理时间长),导致消费效率低于生产效率。

l  消费者异常(如消费者故障、消费者网络异常等)导致无法消费消息。

l  Topic分区设置不合理(leader副本都集中在部分Broker中、分区数太少),或新增分区无消费者消费。

l  Topic频繁重平衡导致性能下降,消费效率降低。

实施步骤

从消息堆积的原因看,消息堆积问题可以从消费者端、生产者端和服务端三个方面进行处理。

l  消费者端

¡  根据实际业务需求,合理增加消费者个数(消费并发度),建议消费者数量和分区数保持一致。

¡  提高消费者的消费速度,通过优化消费者处理逻辑(减少复杂计算、第三方接口调用和读库操作),减少消费时间。

¡  增加消费者每次拉取消息的数量:拉取数据/处理时间 >= 生产速度。

l  生产者端

¡  生产消息时,给消息Key加随机后缀,使消息均衡分布到不同分区上。(在实际业务场景中,为消息Key加随机后缀,会导致消息全局不保序,需根据实际业务判断是否适合给消息Key加随机后缀。)

l  服务端

¡  合理设置Topic的分区数,在不影响业务处理效率的情况下,调大Topic的分区数量。

¡  当服务端出现消息堆积时,对生产者进行熔断,或将生产者的消息转发到其他Topic。


xmkWaQaGwpvl