1. Old Low Level Consumer API
1.1 優(yōu)缺點(diǎn)
1.1.1優(yōu)點(diǎn)
使用Low Level Consumer (Simple Consumer)的主要原因是瞳筏,用戶(hù)希望比Consumer Group更好的控制數(shù)據(jù)的消費(fèi)缭付。比如:
1.同一條消息讀多次
2.只讀取某個(gè)Topic的部分Partition
3.管理事務(wù)奢人,從而確保每條消息被處理一次差购,且僅被處理一次
4.可以做到at-least-once或者exactly-once
1.1.2缺點(diǎn)
1.與Consumer Group相比讨盒,Low Level Consumer要求用戶(hù)做大量的額外工作
必須在應(yīng)用程序中跟蹤offset,從而確定下一條應(yīng)該消費(fèi)哪條消息
2.應(yīng)用程序需要通過(guò)程序獲知每個(gè)Partition的Leader是誰(shuí),必須處理Leader的變化
1.1.3使用Low Level Consumer的一般流程如下
1.查找到一個(gè)“活著”的Broker吉捶,并且找出每個(gè)Partition的Leader
2.找出每個(gè)Partition的Follower
3.定義好請(qǐng)求霹陡,該請(qǐng)求應(yīng)該能描述應(yīng)用程序需要哪些數(shù)據(jù)
4.Fetch數(shù)據(jù)
5.識(shí)別Leader的變化,并對(duì)之作出必要的響應(yīng)
1.2 源碼解析
2. Old High Level Consumer API
2.1 優(yōu)缺點(diǎn)
2.1.1優(yōu)點(diǎn)
很多時(shí)候双藕,客戶(hù)程序只是希望從Kafka讀取數(shù)據(jù)淑趾,不太關(guān)心消息offset的處理。同時(shí)也希望提供一些語(yǔ)義蔓彩,例如同一條消息只被某一個(gè)Consumer消費(fèi)(單播)或被所有Consumer消費(fèi)(廣播)治笨。因此驳概,Kafka Hight Level Consumer提供了一個(gè)從Kafka消費(fèi)數(shù)據(jù)的高層抽象赤嚼,從而屏蔽掉其中的細(xì)節(jié)并提供豐富的語(yǔ)義。
exactly-once
2.1.2缺點(diǎn)
目前顺又,最新版(0.8.2.1)Kafka的Consumer Rebalance的控制策略是由每一個(gè)Consumer通過(guò)在Zookeeper上注冊(cè)Watch完成的更卒。每個(gè)Consumer被創(chuàng)建時(shí)會(huì)觸發(fā)Consumer Group的Rebalance,具體啟動(dòng)流程如下:
- High Level Consumer啟動(dòng)時(shí)將其ID注冊(cè)到其Consumer Group下稚照,在Zookeeper上的路徑為
/consumers/[consumer group]/ids/[consumer id]
- 在
/consumers/[consumer group]/ids
上注冊(cè)Watch - 在
/brokers/ids
上注冊(cè)Watch - 如果Consumer通過(guò)Topic Filter創(chuàng)建消息流蹂空,則它會(huì)同時(shí)在
/brokers/topics
上也創(chuàng)建Watch - 強(qiáng)制自己在其Consumer Group內(nèi)啟動(dòng)Rebalance流程
在這種策略下,每一個(gè)Consumer或者Broker的增加或者減少都會(huì)觸發(fā)Consumer Rebalance果录。因?yàn)槊總€(gè)Consumer只負(fù)責(zé)調(diào)整自己所消費(fèi)的Partition上枕,為了保證整個(gè)Consumer Group的一致性,當(dāng)一個(gè)Consumer觸發(fā)了Rebalance時(shí)弱恒,該Consumer Group內(nèi)的其它所有其它Consumer也應(yīng)該同時(shí)觸發(fā)Rebalance辨萍。
該方式有如下缺陷:
-
Herd effect
任何Broker或者Consumer的增減都會(huì)觸發(fā)所有的Consumer的Rebalance -
Split Brain
每個(gè)Consumer分別單獨(dú)通過(guò)Zookeeper判斷哪些Broker和Consumer 宕機(jī)了,那么不同Consumer在同一時(shí)刻從Zookeeper“看”到的View就可能不一樣返弹,這是由Zookeeper的特性決定的锈玉,這就會(huì)造成不正確的Reblance嘗試爪飘。 -
調(diào)整結(jié)果不可控
所有的Consumer都并不知道其它Consumer的Rebalance是否成功,這可能會(huì)導(dǎo)致Kafka工作在一個(gè)不正確的狀態(tài)拉背。
2.2 源碼解析
3. New Consumer API
1.java語(yǔ)言編寫(xiě)
2.comsumer offset保存于KafkaCluster的__consumer_offsets
topic中师崎,0.8.2版本的consumer offset保存于zk中,可以去zk上手動(dòng)修改offset
3.支持自己commit offset與自動(dòng)commit offset
4.kafka to sparkstreaming的兩種模式解析
相關(guān)文檔&博客
http://kafka.apache.org/090/documentation.html#simpleconsumerapi
http://www.jasongj.com/2015/08/09/KafkaColumn4/
https://cloud.tencent.com/developer/article/1004821