高并發(fā)場(chǎng)景,如何解決Kafka消費(fèi)者慢的問題?
Kafka 消費(fèi)者為什么會(huì)慢
Kafka 本身具備高吞吐和高可擴(kuò)展性,但消費(fèi)者消費(fèi)慢卻是高并發(fā)中,最常見的問題。
比如:處理邏輯復(fù)雜、耗時(shí), 消費(fèi)者在接收到消息后,需要執(zhí)行一定的業(yè)務(wù)邏輯。
最新文章
例如:數(shù)據(jù)轉(zhuǎn)換、業(yè)務(wù)規(guī)則校驗(yàn)、數(shù)據(jù)持久化…等,如果這些處理邏輯過于復(fù)雜或者包含耗時(shí)的操作。
例如:復(fù)雜的計(jì)算、等待外部服務(wù)響應(yīng)…等等,就會(huì)直接影響消費(fèi)速度。
除此之外,消費(fèi)者應(yīng)用程序運(yùn)行的機(jī)器資源不足。
比如: CPU 負(fù)載過高導(dǎo)致處理能力不足,內(nèi)存不足導(dǎo)致頻繁的垃圾回收,網(wǎng)絡(luò)帶寬限制…等等,都會(huì)限制消費(fèi)速度。
優(yōu)化消費(fèi)者應(yīng)用程序
可以利用 Java 的 JProfiler、VisualVM…等工具,分析消費(fèi)者應(yīng)用程序的性能瓶頸。
找出 CPU 密集型、I/O 密集型的代碼段,進(jìn)行優(yōu)化處理。
最新文章
仔細(xì)檢查消費(fèi)邏輯代碼,識(shí)別可以優(yōu)化的地方。
例如:簡(jiǎn)化復(fù)雜的邏輯、避免在主消費(fèi)線程中進(jìn)行長時(shí)間的阻塞操作等。
還可以,將耗時(shí)操作放入后臺(tái)線程、或線程池。
比如: 將一些不影響消息消費(fèi)順序的耗時(shí)操作,可以將其提交到后臺(tái)線程池異步執(zhí)行,避免阻塞主消費(fèi)線程。
提升消費(fèi)并發(fā)能力
在同一個(gè)消費(fèi)者組內(nèi),增加更多的消費(fèi)者實(shí)例。
最新文章
# docker-compose 中部署 3 個(gè)消費(fèi)者容器
 consumer1:
   image: order-consumer
   environment:
     GROUP_ID: order-consumer-group
  
 consumer2:
   image: order-consumer
   environment:
     GROUP_ID: order-consumer-group
  
 consumer3:
   image: order-consumer
   environment:
     GROUP_ID: order-consumer-groupKafka 會(huì)自動(dòng)將主題的分區(qū)分配給不同的消費(fèi)者實(shí)例,從而實(shí)現(xiàn)并行消費(fèi)。
除此之外,在單個(gè)消費(fèi)者應(yīng)用程序內(nèi)部,可以使用多線程、或多進(jìn)程的方式來并行處理拉取到的消息。
例如,一個(gè)消費(fèi)者實(shí)例可以啟動(dòng)多個(gè)線程,每個(gè)線程負(fù)責(zé)處理一部分消息。
優(yōu)化 Kafka 消費(fèi)參數(shù)
增大單次拉取批次,可以讓消費(fèi)者一次處理更多消息。
最新文章
比如:提升 max.poll.records,從默認(rèn)的 500 提高到 2000 或 5000。
以及,提升 fetch.max.bytes,增大拉取消息體積,減少拉取次數(shù)。
通過以上這些策略和方法的綜合應(yīng)用,可以有效地解決 Kafka 消費(fèi)者消費(fèi)慢的問題。















 
 
 















 
 
 
 