一文理解如何解決Kafka消息積壓?jiǎn)栴}
通常情況下,企業(yè)中會(huì)采取輪詢(xún)或者隨機(jī)的方式,通過(guò)Kafka的producer向Kafka集群生產(chǎn)數(shù)據(jù),來(lái)盡可能保證Kafk分區(qū)之間的數(shù)據(jù)是均勻分布的。
如果對(duì)Kafka不了解的話(huà),可以先看這篇博客《一文快速了解Kafka》。
消息積壓的解決方法
加強(qiáng)監(jiān)控報(bào)警以及完善重新拉起任務(wù)機(jī)制,這里就不贅述了。
1.實(shí)時(shí)/消費(fèi)任務(wù)掛掉導(dǎo)致的消費(fèi)積壓的解決方法
在積壓數(shù)據(jù)不多和影響較小的情況下,重新啟動(dòng)消費(fèi)任務(wù),排查宕機(jī)原因。
如果消費(fèi)任務(wù)宕機(jī)時(shí)間過(guò)長(zhǎng)導(dǎo)致積壓數(shù)據(jù)量很大,除了重新啟動(dòng)消費(fèi)任務(wù)、排查問(wèn)題原因,還需要解決消息積壓?jiǎn)栴}。
解決消息積壓可以采用下面方法。
任務(wù)重新啟動(dòng)后直接消費(fèi)最新的消息,對(duì)于"滯后"的歷史數(shù)據(jù)采用離線(xiàn)程序進(jìn)行"補(bǔ)漏"。
如下面圖所示。創(chuàng)建新的topic并配置更多數(shù)量的分區(qū),將積壓消息的topic消費(fèi)者邏輯改為直接把消息打入新的topic,將消費(fèi)邏輯寫(xiě)在新的topic的消費(fèi)者中。

如果還需要保證消息消費(fèi)的局部有序,可以將消費(fèi)者線(xiàn)程池改成多個(gè)隊(duì)列,每個(gè)隊(duì)列用單線(xiàn)程處理,更多內(nèi)容可以查看博客《一文理解Kafka如何保證消息順序性》
2.Kafka分區(qū)數(shù)設(shè)置的不合理或消費(fèi)者"消費(fèi)能力"不足的優(yōu)化
Kafka分區(qū)數(shù)是Kafka并行度調(diào)優(yōu)的最小單元,如果Kafka分區(qū)數(shù)設(shè)置的太少,會(huì)影響Kafka Consumer消費(fèi)的吞吐量。
如果數(shù)據(jù)量很大,Kafka消費(fèi)能力不足,則可以考慮增加Topic的Partition的個(gè)數(shù),同時(shí)提升消費(fèi)者組的消費(fèi)者數(shù)量。
3.Kafka消息key設(shè)置的優(yōu)化
使用Kafka Producer消息時(shí),可以為消息指定key,但是要求key要均勻,否則會(huì)出現(xiàn)Kafka分區(qū)間數(shù)據(jù)不均衡。
所以根據(jù)業(yè)務(wù),合理修改Producer處的key設(shè)置規(guī)則,解決數(shù)據(jù)傾斜問(wèn)題。
