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