Kafka實際使用過程中遇到的一些問題及解決方法:
1.關(guān)于Kafka的分區(qū):
開始使用Kafka的時候,沒有分區(qū)的概念祟印,以為類似于傳統(tǒng)的MQ中間件一樣,就直接從程序中獲取Kafka中的數(shù)據(jù)袒炉。
后來程序搭建了多套旁理,發(fā)現(xiàn)永遠只有一個消費者(消費者應(yīng)用部署在多個tomcat上)會從Kafka中獲取數(shù)據(jù)進行處理樊零,后來才知道有分區(qū)這么一個概念我磁。
具體不說了,網(wǎng)上有很多資料驻襟,總的概括:Kafka的分區(qū)夺艰,相當(dāng)于把一個Topic再細分成了多個通道,一個消費者應(yīng)用可以從一個分區(qū)或多個分區(qū)中獲取數(shù)據(jù)沉衣。
有4個分區(qū)郁副,1個消費者:這一個消費者需要負責(zé)消費四個分區(qū)的數(shù)據(jù)。
有4個分區(qū)豌习,2個消費者:每個消費者負責(zé)兩個分區(qū)
有4個分區(qū)存谎,3個消費者:消費者1負責(zé)1個分區(qū),消費者2負責(zé)1個分區(qū)肥隆,消費者3負責(zé)兩個分區(qū)
有4個分區(qū)既荚,4個消費者:一人一個
有4個分區(qū),5個及以上消費者:4個消費者一人一個栋艳,剩下的消費者空閑不工作恰聘。
部署的時候盡量做到一個消費者對應(yīng)一個分區(qū)。
2.分區(qū)數(shù)據(jù)量不均衡:
Topic上設(shè)置了四個分區(qū)吸占,壓測過程中晴叨,發(fā)現(xiàn)每個分區(qū)的數(shù)據(jù)量差別挺大的,極端的時候矾屯,只有一個分區(qū)有數(shù)據(jù)兼蕊,其余三個分區(qū)空閑。
解決方法件蚕,在用生產(chǎn)者生產(chǎn)數(shù)據(jù)的時候孙技,send方法需要指定key。Kafka會根據(jù)key的值骤坐,通過一定的算法绪杏,如hash,將數(shù)據(jù)平均的發(fā)送到不同的分區(qū)上纽绍。
3.spring-integration-kafka:
在使用spring-integration-kafka做消費者的時候蕾久,發(fā)現(xiàn)CPU和內(nèi)存占用量占用非常的大,后來又發(fā)現(xiàn)不管生產(chǎn)者發(fā)送了多少數(shù)據(jù)拌夏,Kafka的Topic中一直沒有數(shù)據(jù)僧著,這時候才知道spring-integration-kafka會將Topic中的數(shù)據(jù)全拉到本地履因,緩存起來,等待后續(xù)的處理盹愚。
解決方法:
<int:channel id="inputFromKafka">
<int:queue capacity="25"/> --這里加個配置栅迄,相當(dāng)于緩存多少數(shù)據(jù)到本地
</int:channel>