<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          搞懂Kafka的這個(gè)問題,你離大廠就不遠(yuǎn)了!

          共 1479字,需瀏覽 3分鐘

           ·

          2021-09-22 09:58

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

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

          今天,我們就一起來說說這個(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)。

          這里,為了更好的理解,我們簡單的畫一張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不擅長大量數(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è)主題 test 被groupA消費(fèi)了,現(xiàn)在啟動(dòng)另外一個(gè)新的groupB來消費(fèi)test,默認(rèn)test-groupB的Offset不是0,而是還是在Kafka中還沒有建立這樣的一個(gè)Offset,除非當(dāng)test主題有數(shù)據(jù)的時(shí)候,groupB會(huì)收到該數(shù)據(jù),該條數(shù)據(jù)也是第一條數(shù)據(jù),此時(shí),groupB的Offset也是剛初始化的Offset, 除非用顯式的用–from-beginning 來獲取從0開始的數(shù)據(jù)。

          題目解答

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

          1、靈魂一問:你的登錄接口真的安全嗎?
          2、HashMap 中這些設(shè)計(jì),絕了~
          3、在 IntelliJ IDEA 中這樣使用 Git,賊方便了!
          4、計(jì)算機(jī)時(shí)間到底是怎么來的?程序員必看的時(shí)間知識(shí)!
          5、這些IDEA的優(yōu)化設(shè)置趕緊安排起來,效率提升杠杠的!
          6、21 款 yyds 的 IDEA插件
          7、真香!用 IDEA 神器看源碼,效率真高!

          點(diǎn)分享

          點(diǎn)收藏

          點(diǎn)點(diǎn)贊

          點(diǎn)在看

          瀏覽 49
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久精品无码电影 | 国产精品第八页 | 青娱乐在线视频播放 | 人人操人人人人操人人爱 | 北条麻妃在线观看免费91 |