在kafka中,新版本api主要是針對java版本的producer和consumer。
Producer
新版本的Producer,相對于舊版本而言,在設(shè)計(jì)理念上具有以下優(yōu)勢:
- 發(fā)送過程被劃分到兩個(gè)不同的線程:用戶主線程和Sender I/O線程,邏輯更加容易把控。
- 完全異步發(fā)送消息,并提供回掉機(jī)制(callback)用于判斷發(fā)送成功與否。
- 分批機(jī)制(batching),每個(gè)批次中包括多個(gè)發(fā)送請求,提升整體吞吐量。
- 更加合理的分區(qū)策略:對于沒有指定key的消息而言,舊版本Producer分區(qū)策略是默認(rèn)在一段時(shí)間內(nèi)將消息發(fā)送到固定的分區(qū),這容易造成數(shù)據(jù)傾斜(skewed);新版本采用輪詢方式,消息發(fā)送將更加均勻。
- 底層統(tǒng)一使用基于Java的Selector的網(wǎng)絡(luò)客戶端,結(jié)合Java的Future實(shí)現(xiàn)更加健壯和優(yōu)雅的生命周期管理。
Consumer
新版本的Consumer,相對于舊版本而言,在設(shè)計(jì)上的突出優(yōu)勢如下:
- 單線程設(shè)計(jì)——單個(gè)consumer線程可以管理多個(gè)分區(qū)的消費(fèi)Socket連接,極大地簡化了視線。雖然在0.10.1.0版本中額外引入了一個(gè)后臺(tái)心跳線程(background hearbeat thread),不過雙線程的設(shè)計(jì)依然比舊版本consumer魚龍混雜的多線程設(shè)計(jì)簡單得多。
- 位移提交和保存交由Kafka來處理——位移不再保存到zookeeper中,而是單獨(dú)保存在Kafka的一個(gè)內(nèi)部的topic中,這種設(shè)計(jì)即避免了Zookeeper的頻繁讀/寫的性能瓶頸,同時(shí)在Kafka的內(nèi)部的備份機(jī)制天然地視線了位移的高可用管理。
- 消費(fèi)者組的集中式管理——上面提到了Zookeeper要管理位移,其實(shí)它還負(fù)責(zé)管理整個(gè)消費(fèi)者組(consumer group)的成員。者進(jìn)一步加重了對于zookeeper的依賴。新版本consumer改進(jìn)了這種設(shè)計(jì),實(shí)現(xiàn)了一個(gè)集中式協(xié)調(diào)者(corrdinator)的角色。所有組成員的管理都交由該coordinator負(fù)責(zé),因此對于group的管理將更加可控。