面試官:你對Kafka了解嗎?這41個問題你能答出幾個

一、請說明什么是Apache Kafka?

Apache Kafka是由Apache開發的一種發布訂閱消息系統,它是一個分布式的、分區的和重復的日志服務。

二、請說明什么是傳統的消息傳遞方法?

傳統的消息傳遞方法包括兩種:

  • 排隊:在隊列中,一組用戶可以從服務器中讀取消息,每條消息都發送給其中一個人。
  • 發布-訂閱:在這個模型中,消息被廣播給所有的用戶。

三、 請說明Kafka相對傳統技術有什么優勢?

  • 快速:單一的Kafka代理可以處理成千上萬的客戶端,每秒處理數兆字節的讀寫操作。
  • 可伸縮:在一組機器上對數據進行分區和簡化,以支持更大的數據
  • 持久:消息是持久性的,并在集群中進行復制,以防止數據丟失。
  • 設計:它提供了容錯保證和持久性

四、在Kafka中broker的意義是什么?

接收Producer發過來的數據,并且將它持久化,同時提供給Consumer去訂閱組成Kafka集群節點,之間沒有主從關系,依賴ZooKeeper來協調,broker負責消息的讀取和存儲,一個broker可以管理多個partition

五、什么是broker?作用是什么?

一個單獨的kafka server就是一個broker,broker主要工作就是接收生產者發過來的消息,分配offset,之后保存到磁盤中。同時,接收消費者、其他broker的請求,根據請求類型進行相應的處理并返回響應,在一般的生產環境中,一個broker獨占一臺物理服務器

六、Kafka服務器能接收到的最大信息是多少?

Kafka服務器可以接收到的消息的最大大小是1000000字節。

七、解釋Kafka的Zookeeper是什么?我們可以在沒有Zookeeper的情況下使用Kafka嗎?

Zookeeper是一個開放源碼的、高性能的協調服務,它用于Kafka的分布式應用。作用:協調Kafka Broker,存儲原數據:consumer的offset+broker信息+topic信息+partition個信息。

不,不可能越過Zookeeper,直接聯系Kafka broker。一旦Zookeeper停止工作,它就不能服務客戶端請求。

Zookeeper主要用于在集群中不同節點之間進行通信

在Kafka中,它被用于提交偏移量,因此如果節點在任何情況下都失敗了,它都可以從之前提交的偏移量中獲取

除此之外,它還執行其他活動,如: leader檢測、分布式同步、配置管理、識別新節點何時離開或連接、集群、節點實時狀態等等。

八、解釋Kafka的用戶如何消費信息?

在Kafka中傳遞消息是通過使用sendfile【零拷貝】 API完成的。它支持將字節從套接口轉移到磁盤,通過內核空間保存副本,并在內核用戶之間調用內核。零拷貝:用戶向內核去發送一個命令,我要操作那些數據,然后直接從磁盤轉成Socket Buffer,再從Socket Buffer到網卡Buffer,再傳出去【少了兩次的copy】

九、解釋如何提高遠程用戶的吞吐量?

如果用戶位于與broker不同的數據中心,則可能需要調優套接口緩沖區大小,以對長網絡延遲進行攤銷。

十、解釋一下,在數據制作過程中,你如何能從Kafka得到準確的信息?

在數據中,為了精確地獲得Kafka的消息,你必須遵循兩件事: 在數據消耗期間避免重復,在數據生產過程中避免重復。

這里有兩種方法,可以在數據生成時準確地獲得一個語義

每個分區使用一個單獨的寫入器,每當你發現一個網絡錯誤,檢查該分區中的最后一條消息,以查看您的最后一次寫入是否成功

在消息中包含一個主鍵(UUID或其他),并在用戶中進行反復制

十一、解釋如何減少ISR中的擾動?broker什么時候離開ISR?

ISR是一組與leaders完全同步的消息副本,也就是說ISR中包含了所有提交的消息。ISR應該總是包含所有的副本,直到出現真正的故障。如果一個副本從leader中脫離出來,將會從ISR中刪除。

十二、Kafka為什么需要復制?

Kafka的信息復制確保了任何已發布的消息不會丟失,并且可以在機器錯誤、程序錯誤或更常見些的軟件升級中使用。

十三、如果副本在ISR中停留了很長時間表明什么?

如果一個副本在ISR中保留了很長一段時間,那么它就表明,跟蹤器無法像在leader收集數據那樣快速地獲取數據。

十四、請說明如果首選的副本不在ISR中會發生什么?

如果首選的副本不在ISR中,控制器將無法將leadership轉移到首選的副本。

十五、有可能在生產后發生消息偏移嗎?

在大多數隊列系統中,作為生產者的類無法做到這一點,它的作用是觸發并忘記消息。broker將完成剩下的工作,比如使用id進行適當的元數據處理、偏移量等。作為消息的用戶,你可以從Kafka broker中獲得補償。如果你注視SimpleConsumer類,你會注意到它會獲取包括偏移量作為列表的MultiFetchResponse對象。此外,當你對Kafka消息進行迭代時,你會擁有包括偏移量和消息發送的MessageAndOffset對象。

十六、kafka主要特征

kafka具有近乎實時性的消息處理能力,面對海量數據,高效的存儲消息和查詢消息。kafka將消息保存在磁盤中,以順序讀寫的方式訪問磁盤,從而避免了隨機讀寫磁盤導致的性能瓶頸kafka支持批量讀寫消息,并且對消息批量壓縮,提高了網絡利用率和壓縮效率kafka支持消息分區,每個分區中的消息保證順序傳輸,而分區之間可以并發操作,提高了kafka的并發能力kafka支持在線增加分區,支持在線水平擴展kafka支持為每個分區創建多個副本,其中只會有一個leader副本負責讀寫,其他副本只負責與leader副本同步,這種方式提高了數據的容災能力,kafka會將leader副本均勻的分布在集群中的服務器上,實現性能最大化

十七、列舉kafka的應用場景

  • 日志收集:一個公司可以用Kafka可以收集各種服務的log,通過kafka以統一接口服務的方式開放給各種consumer,例如Hadoop、Hbase、Solr等
  • 消息系統:解耦和生產者和消費者、緩存消息等
  • 用戶活動跟蹤:Kafka經常被用來記錄web用戶或者app用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動信息被各個服務器發布到kafka的topic中,然后訂閱者通過訂閱這些topic來做實時的監控分析,或者裝載到Hadoop、數據倉庫中做離線分析和挖掘
  • 運營指標:Kafka也經常用來記錄運營監控數據。包括收集各種分布式應用的數據,生產各種操作的集中反饋,比如報警和報告
  • 流式處理:比如spark streaming和storm
  • 事件源

十八、kafka主題分區的作用

kafka的每個topic都可以分為多個partition,每個partition都有多個replica(副本),每個分區中的消息是不同的,提高了并發讀寫的能力,而同一分區的不同副本中保存的是相同的消息,副本之間是一主多從關系,其中leader副本處理讀寫請求,follower副本只與leader副本進行消息同步,當leader副本出現故障時,則從follower副本中重新選舉leader副本對外提供服務。這樣,通過提高分區的數量,就可以實現水平擴展,通過提高副本數量,就可以提高容災能力

十九、consumer水平擴展如何實現

kafka支持consumer水平擴展,可以讓多個consumer加入一個consumer group,在一個consumer group中,每個分區只能分配給一個consumer,當kafka服務端增加分區數量進行水平擴展后,可以向consumer group中增加新的consumer來提高整個consumer group的消費能力,當consumer group 中的一個consumer出現故障下線時,會通過rebalance操作下線consumer,它負責處理的分區將分配給其他consumer

二十、消息的順序

kafka保證一個partition內消息是有序的,但是并不保證多個partition之間的數據有順序,每個topic可以劃分成多個分區,同一個topic下的不同分區包含的消息是不同的,每個消息在被添加到分區時,都會被分配一個offset,它是此消息在分區中的唯一編號,kafka通過offset保證消息在分區內的順序,offset順序不跨分區,即kafka只保證在同一個分區內的消息是有序的

二十一、為了避免磁盤被占滿,kafka會周期性的刪除陳舊的消息,刪除策略是什么?

  • 一種是根據消息保留的時間
  • 一種是根據topic存儲的數據大小

二十二、什么是日志壓縮

在很多場景中,消息的key與value之間的對應關系是不斷變化的,消費者只關心key對應的最新value,此時,可以開啟kafka的日志壓縮功能,kafka會在后臺啟動一個線程,定期將相同key的消息進行合并,只保留最新的value值

二十三、同一分區的多個副本包括的消息是否一致?

每個副本中包含的消息是一樣的,但是再同一時刻,副本之間并不是完全一樣的

二十四、ISR集合是什么?誰維護著?如何維護?

ISR(In-Sync Replica)集合表示的是目前可用并且消息量與leader相差不多的副本集合,這是整個副本集合的一個子集ISR集合的副本必須滿足:副本所在節點必須維持著與zookeeper的連接;副本最后一條消息的offset與leader副本最后一條消息的offset之間的差值不能超出指定的閾值每個分區的leader副本都會維護此分區的ISR集合,寫請求首先由leader副本處理,之后follower副本會從leader副本上拉取寫入的消息,這個過程會有一定的延遲,導致follower副本中保存的消息略少于leader副本,只要未超出閾值都是可以容忍的

二十五、Kafka的設計是什么樣的呢?

Kafka將消息以topic為單位進行歸納將向Kafka topic發布消息的程序成為producer將預訂topics并消費消息的程序成為consumerKafka以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個brokerproducers通過網絡將消息發送到Kafka集群,集群向消費者提供消息

二十六、數據傳輸的事物定義有哪三種?

數據傳輸的事務定義通常有以下三種級別:
(1)最多一次:消息不會被重復發送,最多被傳輸一次,但也有可能一次不傳輸
(2)最少一次:消息不會被漏發送,最少被傳輸一次,但也有可能被重復傳輸.
(3)精確的一次(Exactly once):不會漏傳輸也不會重復傳輸,每個消息都傳輸被一次而且僅僅被傳輸一次,這是大家所期望的

二十七、Kafka判斷一個節點是否還活著有那兩個條件?

  • 節點必須可以維護和ZooKeeper的連接,Zookeeper通過心跳機制檢查每個節點的連接

  • 如果節點是個follower,他必須能及時的同步leader的寫操作,延時不能太久

二十八、producer是否直接將數據發送到broker的leader(主節點)?

producer直接將數據發送到broker的leader(主節點),不需要在多個節點進行分發,為了幫助producer做到這點,所有的Kafka節點都可以及時的告知:哪些節點是活動的,目標topic目標分區的leader在哪。這樣producer就可以直接將消息發送到目的地了

二十九、Kafa consumer是否可以消費指定分區消息?

Kafa consumer消費消息時,向broker發出"fetch"請求去消費特定分區的消息,consumer指定消息在日志中的偏移量(offset),就可以消費從這個位置開始的消息,customer擁有了offset的控制權,可以向后回滾去重新消費之前的消息,這是很有意義的

三十、Kafka消息是采用Pull模式,還是Push模式?

Kafka最初考慮的問題是,customer應該從brokes拉取消息還是brokers將消息推送到consumer,也就是pull還push。在這方面,Kafka遵循了一種大部分消息系統共同的傳統的設計:producer將消息推送到broker,consumer從broker拉取消息一些消息系統比如Scribe和Apache Flume采用了push模式,將消息推送到下游的consumer。這樣做有好處也有壞處:由broker決定消息推送的速率,對于不同消費速率的consumer就不太好處理了。消息系統都致力于讓consumer以最大的速率最快速的消費消息,但不幸的是,push模式下,當broker推送的速率遠大于consumer消費的速率時,consumer恐怕就要崩潰了。最終Kafka還是選取了傳統的pull模式Pull模式的另外一個好處是consumer可以自主決定是否批量的從broker拉取數據。Push模式必須在不知道下游consumer消費能力和消費策略的情況下決定是立即推送每條消息還是緩存之后批量推送。如果為了避免consumer崩潰而采用較低的推送速率,將可能導致一次只推送較少的消息而造成浪費。Pull模式下,consumer就可以根據自己的消費能力去決定這些策略Pull有個缺點是,如果broker沒有可供消費的消息,將導致consumer不斷在循環中輪詢,直到新消息到t達。為了避免這點,Kafka有個參數可以讓consumer阻塞知道新消息到達(當然也可以阻塞知道消息的數量達到某個特定的量這樣就可以批量發

三十一、Kafka存儲在硬盤上的消息格式是什么?

消息由一個固定長度的頭部和可變長度的字節數組組成。頭部包含了一個版本號和CRC32校驗碼。消息長度: 4 bytes (value: 1+4+n)版本號: 1 byteCRC校驗碼: 4 bytes具體的消息: n bytes

三十二、Kafka高效文件存儲設計特點:

Kafka把topic中一個parition大文件分成多個小文件段,通過多個小文件段,就容易定期清除或刪除已經消費完文件,減少磁盤占用。

  • 通過索引信息可以快速定位message和確定response的最大大小。
  • 通過index元數據全部映射到memory,可以避免segment file的IO磁盤操作。
  • 通過索引文件稀疏存儲,可以大幅降低index文件元數據占用空間大小。

三十三、Kafka 與傳統消息系統之間有三個關鍵區別

Kafka 持久化日志,這些日志可以被重復讀取和無限期保留Kafka 是一個分布式系統:它以集群的方式運行,可以靈活伸縮,在內部通過復制數據提升容錯能力和高可用性Kafka 支持實時的流式處理

三十四、Kafka創建Topic時如何將分區放置到不同的Broker中

副本因子不能大于 Broker 的個數;第一個分區(編號為0)的第一個副本放置位置是隨機從 brokerList 選擇的;其他分區的第一個副本放置位置相對于第0個分區依次往后移。也就是如果我們有5個 Broker,5個分區,假設第一個分區放在第四個 Broker 上,那么第二個分區將會放在第五個 Broker 上;第三個分區將會放在第一個 Broker 上;第四個分區將會放在第二個 Broker 上,依次類推;剩余的副本相對于第一個副本放置位置其實是由 nextReplicaShift 決定的,而這個數也是隨機產生的

三十五、Kafka新建的分區會在哪個目錄下創建

在啟動 Kafka 集群之前,我們需要配置好 log.dirs 參數,其值是 Kafka 數據的存放目錄,這個參數可以配置多個目錄,目錄之間使用逗號分隔,通常這些目錄是分布在不同的磁盤上用于提高讀寫性能。當然我們也可以配置 log.dir 參數,含義一樣。只需要設置其中一個即可。如果 log.dirs 參數只配置了一個目錄,那么分配到各個 Broker 上的分區肯定只能在這個目錄下創建文件夾用于存放數據。但是如果 log.dirs 參數配置了多個目錄,那么 Kafka 會在哪個文件夾中創建分區目錄呢?答案是:Kafka 會在含有分區目錄最少的文件夾中創建新的分區目錄,分區目錄名為 Topic名+分區ID。注意,是分區文件夾總數最少的目錄,而不是磁盤使用量最少的目錄!也就是說,如果你給 log.dirs 參數新增了一個新的磁盤,新的分區目錄肯定是先在這個新的磁盤上創建直到這個新的磁盤目錄擁有的分區目錄不是最少為止。

三十六、partition的數據如何保存到硬盤

topic中的多個partition以文件夾的形式保存到broker,每個分區序號從0遞增,且消息有序Partition文件下有多個segment(xxx.index,xxx.log)segment 文件里的 大小和配置文件大小一致可以根據要求修改 默認為1g如果大小大于1g時,會滾動一個新的segment并且以上一個segment最后一條消息的偏移量命名

三十七、kafka的ack機制

request.required.acks有三個值 0、1、-1:0:生產者不會等待broker的ack,這個延遲最低但是存儲的保證最弱當server掛掉的時候就會丟數據1:服務端會等待ack值 leader副本確認接收到消息后發送ack但是如果leader掛掉后他不確保是否復制完成新leader也會導致數據丟失-1:同樣在1的基礎上 服務端會等所有的follower的副本受到數據后才會受到leader發出的ack,這樣數據不會丟失

三十八、Kafka的消費者如何消費數據

消費者每次消費數據的時候,消費者都會記錄消費的物理偏移量(offset)的位置等到下次消費時,他會接著上次位置繼續消費

三十九、消費者負載均衡策略

一個消費者組中的一個分片對應一個消費者成員,他能保證每個消費者成員都能訪問,如果組中成員太多會有空閑的成員

四十、數據有序

一個消費者組里它的內部是有序的消費者組與消費者組之間是無序的

四十一、kafaka生產數據時數據的分組策略

生產者決定數據產生到集群的哪個partition中每一條消息都是以(key,value)格式Key是由生產者發送數據傳入所以生產者(key)決定了數據產生到集群的哪個partition

感謝你看到這里,我是程序員麥冬 ,一個java開發從業者,深耕行業六年了,每天都會分享java相關技術文章或行業資訊

歡迎大家關注和轉發文章,后期還有福利贈送!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。