消息堆積最佳實踐
更新時間 2024-02-04 17:33:00
最近更新時間: 2024-02-04 17:33:00
分享文章
方案概述
Kafka將Topic劃分為多個分區,消息被存儲在不同的分區中。在同一個消費組內,一個消費者可同時消費多個分區,但一個分區在同一時刻只能被一個消費者消費。
在消息處理過程中,如果客戶端的消費速度跟不上服務端的發送速度,未處理的消息會越來越多,這部分消息就被稱為堆積消息。消息沒有被及時消費就會產生消息堆積,從而會造成消息消費延遲。
導致消息堆積的常見原因如下:
- 生產者短時間內生產大量消息到Topic,消費者無法及時消費。
- 消費者的消費能力不足(消費者并發低、消息處理時間長),導致消費效率低于生產效率。
- 消費者異常(如消費者故障、消費者網絡異常等)導致無法消費消息。
- Topic分區設置不合理(leader副本都集中在部分Broker中、分區數太少),或新增分區無消費者消費。
- Topic頻繁重平衡導致性能下降,消費效率降低。
實施步驟
從消息堆積的原因看,消息堆積問題可以從消費者端、生產者端和服務端三個方面進行處理。
-
消費者端
根據實際業務需求,合理增加消費者個數(消費并發度),建議消費者數量和分區數保持一致。
提高消費者的消費速度,通過優化消費者處理邏輯(減少復雜計算、第三方接口調用和讀庫操作),減少消費時間。
增加消費者每次拉取消息的數量:拉取數據/處理時間 >= 生產速度。 -
生產者端
生產消息時,給消息Key加隨機后綴,使消息均衡分布到不同分區上。(在實際業務場景中,為消息Key加隨機后綴,會導致消息全局不保序,需根據實際業務判斷是否適合給消息Key加隨機后綴。)
-
服務端
合理設置Topic的分區數,在不影響業務處理效率的情況下,調大Topic的分區數量。
當服務端出現消息堆積時,對生產者進行熔斷,或將生產者的消息轉發到其他Topic。