新聞中心
面試必問 | 聊聊Kafka的消費模型?
作者:冰河 2021-12-27 08:22:18
開發(fā)
架構(gòu)
Kafka 最近,有些讀者去頭條二面,被面試官問了一個關于Kafka的問題:多個Kafka消費者如何同時消費相同Topic下的相同Partition的數(shù)據(jù)? 看似一個簡單的問題,竟然把這位讀者問懵了!

在延川等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站制作、成都做網(wǎng)站 網(wǎng)站設計制作定制網(wǎng)站建設,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,網(wǎng)絡營銷推廣,外貿(mào)網(wǎng)站制作,延川網(wǎng)站建設費用合理。
大家好,我是冰河~~
最近,有些讀者去頭條二面,被面試官問了一個關于Kafka的問題:多個Kafka消費者如何同時消費相同Topic下的相同Partition的數(shù)據(jù)? 看似一個簡單的問題,竟然把這位讀者問懵了!
今天,我們就一起來說說這個面試題,好了,開始今天的主題。
題目分析
首先,要明確面試官的問題:多個Kafka消費者如何同時消費相同Topic下的相同Partition的數(shù)據(jù)? 這個問題問的已經(jīng)很明顯了,我們只要回答出如何讓多個Kafka消費者同時消費相同Topic下的相同Partition的數(shù)據(jù)就可以了。
為了能夠回答好這個問題,我們需要理解Kafka中的一個概念,就是 消費者組(Consumer Group)。消費者組是Kafka實現(xiàn)單播和廣播兩種消息模型的基礎和手段。
對于同一個Topic(主題)來說,每個消費者組都可以拿到這個Topic中的全部數(shù)據(jù)。消費者組內(nèi)的所有消費者協(xié)調(diào)在一起來訂閱并消費Kafka Topic中的所有分區(qū)。這里,每個分區(qū)只能由同一個消費者組內(nèi)的一個消費者來消費。
這里,為了更好的理解,我們簡單的畫一張Kafka消費消息的原理圖,如下所示。
在這張圖中,一個主題可以配置幾個分區(qū),生產(chǎn)者發(fā)送的消息分發(fā)到不同的分區(qū)中,消費者接收數(shù)據(jù)的時候是按照消費者組來接收的,Kafka確保每個分區(qū)的消息只能被同一個消費者組中的同一個消費者消費。
如果想要重復消費,那么需要其他的消費者組來消費。Zookeerper中保存每個主題下的每個分區(qū)在每個消費者組中消費的offset。
新版kafka把這個offset保存到了一個__consumer_offsert的主題下。 這個__consumer_offsert有50個分區(qū),通過將消費者組的id哈希值%50的值來確定要保存到那一個分區(qū)。這樣也是為了考慮到Zookeeper不擅長大量數(shù)據(jù)讀寫的原因。
所以,如果要一個消費者組用幾個消費者來同時消費Kafka中消息的話,可以使用多線程來讀取消息,一個線程相當于一個消費者實例。當消費者的數(shù)量大于分區(qū)的數(shù)量時,有些消費者線程會讀取不到數(shù)據(jù)。
擴展知識
這里,我們舉一個例子:假設一個主題 testTopic 被groupA消費了,現(xiàn)在啟動另外一個新的groupB來消費testTopic,默認testTopic-groupB的Offset不是0,而是在Kafka中還沒有建立這樣的一個Offset。
除非當testTopic 主題有數(shù)據(jù)的時候,groupB會收到該數(shù)據(jù),該條數(shù)據(jù)也是第一條數(shù)據(jù),此時,groupB的Offset并不是從0開始的,而是從剛初始化的Offset開始的, 除非顯式的用–from-beginning 來獲取從0開始的數(shù)據(jù)。
題目解答
多個Kafka消費者要想同時消費相同Topic下的相同Partition的數(shù)據(jù),則需要將這些Kafka消費者放到不同的消費者組中。
好了,今天就到這兒吧,我是冰河,我們下期見~~
本文轉(zhuǎn)載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系冰河技術公眾號。
當前名稱:面試必問 | 聊聊Kafka的消費模型?
瀏覽路徑:http://m.5511xx.com/article/dhsedgi.html


咨詢
建站咨詢
