自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試必問 | 聊聊Kafka的消費(fèi)模型?

開發(fā) 架構(gòu) Kafka
最近,有些讀者去頭條二面,被面試官問了一個(gè)關(guān)于Kafka的問題:多個(gè)Kafka消費(fèi)者如何同時(shí)消費(fèi)相同Topic下的相同Partition的數(shù)據(jù)? 看似一個(gè)簡(jiǎn)單的問題,竟然把這位讀者問懵了!

[[442172]]

大家好,我是冰河~~

最近,有些讀者去頭條二面,被面試官問了一個(gè)關(guān)于Kafka的問題:多個(gè)Kafka消費(fèi)者如何同時(shí)消費(fèi)相同Topic下的相同Partition的數(shù)據(jù)? 看似一個(gè)簡(jiǎn)單的問題,竟然把這位讀者問懵了!

今天,我們就一起來說說這個(gè)面試題,好了,開始今天的主題。

題目分析

首先,要明確面試官的問題:多個(gè)Kafka消費(fèi)者如何同時(shí)消費(fèi)相同Topic下的相同Partition的數(shù)據(jù)? 這個(gè)問題問的已經(jīng)很明顯了,我們只要回答出如何讓多個(gè)Kafka消費(fèi)者同時(shí)消費(fèi)相同Topic下的相同Partition的數(shù)據(jù)就可以了。

為了能夠回答好這個(gè)問題,我們需要理解Kafka中的一個(gè)概念,就是 消費(fèi)者組(Consumer Group)。消費(fèi)者組是Kafka實(shí)現(xiàn)單播和廣播兩種消息模型的基礎(chǔ)和手段。

對(duì)于同一個(gè)Topic(主題)來說,每個(gè)消費(fèi)者組都可以拿到這個(gè)Topic中的全部數(shù)據(jù)。消費(fèi)者組內(nèi)的所有消費(fèi)者協(xié)調(diào)在一起來訂閱并消費(fèi)Kafka Topic中的所有分區(qū)。這里,每個(gè)分區(qū)只能由同一個(gè)消費(fèi)者組內(nèi)的一個(gè)消費(fèi)者來消費(fèi)。

這里,為了更好的理解,我們簡(jiǎn)單的畫一張Kafka消費(fèi)消息的原理圖,如下所示。

在這張圖中,一個(gè)主題可以配置幾個(gè)分區(qū),生產(chǎn)者發(fā)送的消息分發(fā)到不同的分區(qū)中,消費(fèi)者接收數(shù)據(jù)的時(shí)候是按照消費(fèi)者組來接收的,Kafka確保每個(gè)分區(qū)的消息只能被同一個(gè)消費(fèi)者組中的同一個(gè)消費(fèi)者消費(fèi)。

如果想要重復(fù)消費(fèi),那么需要其他的消費(fèi)者組來消費(fèi)。Zookeerper中保存每個(gè)主題下的每個(gè)分區(qū)在每個(gè)消費(fèi)者組中消費(fèi)的offset。

新版kafka把這個(gè)offset保存到了一個(gè)__consumer_offsert的主題下。 這個(gè)__consumer_offsert有50個(gè)分區(qū),通過將消費(fèi)者組的id哈希值%50的值來確定要保存到那一個(gè)分區(qū)。這樣也是為了考慮到Zookeeper不擅長(zhǎng)大量數(shù)據(jù)讀寫的原因。

所以,如果要一個(gè)消費(fèi)者組用幾個(gè)消費(fèi)者來同時(shí)消費(fèi)Kafka中消息的話,可以使用多線程來讀取消息,一個(gè)線程相當(dāng)于一個(gè)消費(fèi)者實(shí)例。當(dāng)消費(fèi)者的數(shù)量大于分區(qū)的數(shù)量時(shí),有些消費(fèi)者線程會(huì)讀取不到數(shù)據(jù)。

擴(kuò)展知識(shí)

這里,我們舉一個(gè)例子:假設(shè)一個(gè)主題 testTopic 被groupA消費(fèi)了,現(xiàn)在啟動(dòng)另外一個(gè)新的groupB來消費(fèi)testTopic,默認(rèn)testTopic-groupB的Offset不是0,而是在Kafka中還沒有建立這樣的一個(gè)Offset。

除非當(dāng)testTopic 主題有數(shù)據(jù)的時(shí)候,groupB會(huì)收到該數(shù)據(jù),該條數(shù)據(jù)也是第一條數(shù)據(jù),此時(shí),groupB的Offset并不是從0開始的,而是從剛初始化的Offset開始的, 除非顯式的用–from-beginning 來獲取從0開始的數(shù)據(jù)。

題目解答

多個(gè)Kafka消費(fèi)者要想同時(shí)消費(fèi)相同Topic下的相同Partition的數(shù)據(jù),則需要將這些Kafka消費(fèi)者放到不同的消費(fèi)者組中。

好了,今天就到這兒吧,我是冰河,我們下期見~~

本文轉(zhuǎn)載自微信公眾號(hào)「冰河技術(shù)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系冰河技術(shù)公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 冰河技術(shù)
相關(guān)推薦

2021-12-09 12:22:28

MyBatis流程面試

2021-12-06 11:03:57

JVM性能調(diào)優(yōu)

2023-06-07 08:08:43

JVM內(nèi)存模型

2023-02-03 07:24:49

雙親委派模型

2020-07-28 08:59:22

JavahreadLocal面試

2020-11-05 13:12:47

紅黑樹

2019-03-15 19:41:39

MySQL面試數(shù)據(jù)庫(kù)

2024-01-05 14:20:55

MySQL索引優(yōu)化器

2021-12-13 11:12:41

Spring事務(wù)失效

2023-02-06 07:01:51

2020-10-14 09:04:18

Kafka系統(tǒng)通信

2023-02-17 08:02:45

@Autowired@Resource

2023-02-01 07:15:16

2020-09-29 15:24:07

面試數(shù)據(jù)結(jié)構(gòu)Hashmap

2020-02-18 14:25:51

Java線程池拒絕策略

2021-04-26 17:23:21

JavaCAS原理

2025-03-04 05:46:05

2020-10-12 18:00:39

JavaAQS代碼

2023-02-02 07:06:10

2021-09-10 18:47:22

Redis淘汰策略
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)