概念
消費(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)。