高并發(fā)場(chǎng)景下,Kafka消費(fèi)慢會(huì)造成什么影響?
消息堆積
當(dāng) Kafka 消費(fèi)者的消費(fèi)速度跟不上 Kafka 主題中生產(chǎn)消息的速度時(shí),會(huì)引發(fā)一系列問題,對(duì)整個(gè)數(shù)據(jù)流管道產(chǎn)生不利影響。
消息堆積:這是最直接也是最明顯的后果。
因?yàn)椋荷a(chǎn)者源源不斷地將消息,寫入 Kafka 主題的分區(qū)中,而消費(fèi)者由于處理能力不足。
無法及時(shí)地將這些消息消費(fèi)掉,就會(huì)導(dǎo)致未被消費(fèi)的消息,在 Kafka Broker 端越積越多。
當(dāng)消費(fèi)速度慢于生產(chǎn)速度時(shí),每個(gè)分區(qū)的 LEO 和 Consumer Offset 之間的差距會(huì)持續(xù)增大,形成顯著的消費(fèi)積壓。
可以,增加消費(fèi)者線程數(shù)、或部署更多消費(fèi)者實(shí)例。
以及,一次拉取多條消息后,統(tǒng)一批量寫入數(shù)據(jù)庫(kù)、緩存或調(diào)用接口,顯著提升吞吐。
存儲(chǔ)壓力增大
Broker 存儲(chǔ)壓力增大,比如:大量的未消費(fèi)消息,會(huì)占用 Broker 的磁盤空間。
長(zhǎng)期積累可能導(dǎo)致磁盤空間不足,影響 Kafka 服務(wù)的穩(wěn)定性。
以及,消息過期風(fēng)險(xiǎn),比如; Kafka 通常會(huì)配置消息的保留策略(例如基于時(shí)間或大小)。
如果消息堆積的時(shí)間超過保留策略的限制,這些尚未被消費(fèi)的消息可能會(huì)被 Broker 清理掉,導(dǎo)致數(shù)據(jù)丟失。
延遲增加
消息從生產(chǎn)者發(fā)送到 Kafka Broker,再到被消費(fèi)者處理完成,經(jīng)歷了一定的時(shí)間。
如果消費(fèi)者消費(fèi)速度慢,那么消息在隊(duì)列中等待被處理的時(shí)間就會(huì)變長(zhǎng),從而導(dǎo)致整個(gè)數(shù)據(jù)處理的端到端延遲增加。
對(duì)于那些對(duì)實(shí)時(shí)性要求較高的應(yīng)用場(chǎng)景,例如:實(shí)時(shí)監(jiān)控、在線分析…等,這種延遲的增加是不可接受的。
下游系統(tǒng)壓力
消費(fèi)慢有時(shí)是由于下游數(shù)據(jù)庫(kù)或接口處理慢,導(dǎo)致調(diào)用阻塞,反過來讓 Kafka 消費(fèi)堆積更嚴(yán)重。
比如:短時(shí)間內(nèi)接收到大量延遲到達(dá)的數(shù)據(jù),可能導(dǎo)致下游系統(tǒng)資源(CPU、內(nèi)存、網(wǎng)絡(luò)等)耗盡,服務(wù)響應(yīng)變慢甚至崩潰。
解決消息處理延遲增加的關(guān)鍵在于縮短單條消息的處理時(shí)間,并提高整體的并發(fā)處理能力。
將一些非關(guān)鍵的、耗時(shí)的操作異步執(zhí)行,例如將處理結(jié)果寫入數(shù)據(jù)庫(kù)、發(fā)送通知等,避免阻塞主消費(fèi)流程。
以及,通過增加消費(fèi)者實(shí)例內(nèi)的線程或進(jìn)程數(shù)量,或者使用 Reactor 模式等并發(fā)編程模型,同時(shí)處理多條消息。