Kafka使用筆記(三、消費(fèi)者詳解)

概念

消費(fèi)者和消費(fèi)組

kafka消費(fèi)者是消費(fèi)組的一部分,當(dāng)多個(gè)消費(fèi)者形成一個(gè)消費(fèi)組來消費(fèi)主題時(shí),每個(gè)消費(fèi)者會(huì)接收到不同分區(qū)的消息。假設(shè)有一個(gè)T1主題,該主題有4個(gè)分區(qū),同時(shí)我們有一個(gè)消費(fèi)組G1,該組只有一個(gè)消費(fèi)者C1。那么消費(fèi)者C1將會(huì)收到這4個(gè)分區(qū)的消息,如下圖所示:



Kafka一個(gè)很重要的特性就是,只需寫入一次消息,可以支持任意多的應(yīng)用讀取這個(gè)消息。換句話說,每個(gè)應(yīng)用都可以讀到全量的消息。為了使得每個(gè)應(yīng)用都能讀到全量消息,應(yīng)用需要有不同的消費(fèi)組。對于上面的例子,假如我們新增一個(gè)新的消費(fèi)組G2,而這個(gè)消費(fèi)組有兩個(gè)消費(fèi)者,那么會(huì)是這樣的:


訂閱主題和分區(qū)

創(chuàng)建完消費(fèi)者后我們便可以訂閱主題了,只需要通過調(diào)用subscribe()方法即可,這個(gè)方法接收一個(gè)主題列表:

KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe(Arrays.asList(topic));

另外,我們也可以使用正則表達(dá)式來匹配多個(gè)主題,而且訂閱之后如果又有匹配新主題,那么這個(gè)消費(fèi)組會(huì)立即對其進(jìn)行消費(fèi)。正則表達(dá)式在連接Kafka與其他系統(tǒng)時(shí)非常有用。比如訂閱所有的測試主題:

consumer.subscribe(Pattern.compile("test*"));

指定訂閱的分區(qū):

//指定訂閱的分區(qū)
consumer.assign(Arrays.asList(new TopicPartition("topic0701",0)));

位移提交

對于Kafka中的分區(qū)而言,它的每條消息都有唯一的offset,用來表示消息在分區(qū)中的位置。
當(dāng)我們調(diào)用poll()時(shí),該方法會(huì)返回我們沒有消費(fèi)的消息。當(dāng)消息從broker返回消費(fèi)者時(shí),broker并不跟蹤這些消息是否被消費(fèi)者接收到;Kafka讓消費(fèi)者自身來管理消費(fèi)的位移,并向消費(fèi)者提供更新位移的接口,這種更新位移方式稱為提交(commit)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容