Kafka的面試題


1.Kafka的設計是什么樣的呢?
Kafka將消息以topic為單位進行歸納
將向Kafka topic發布消息的程序成為producers.
將預訂topics並消費消息的程序成為consumer.
Kafka以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個broker.
producers通過網絡將消息發送到Kafka集群,集群向消費者提供消息

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

3.Kafka判斷一個節點是否還活着有那兩個條件?
(1)節點必須可以維護和ZooKeeper的連接,Zookeeper通過心跳機制檢查每個節點的連接
(2)如果節點是個follower,他必須能及時的同步leader的寫操作,延時不能太久

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

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

6、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阻塞知道新消息到達(當然也可以阻塞知道消息的數量達到某個特定的量這樣就可以批量發

7.Kafka存儲在硬盤上的消息格式是什么?
消息由一個固定長度的頭部和可變長度的字節數組組成。頭部包含了一個版本號和CRC32校驗碼。
消息長度: 4 bytes (value: 1+4+n)
版本號: 1 byte
CRC校驗碼: 4 bytes
具體的消息: n bytes

8.Kafka高效文件存儲設計特點:
(1).Kafka把topic中一個parition大文件分成多個小文件段,通過多個小文件段,就容易定期清除或刪除已經消費完文件,減少磁盤占用。
(2).通過索引信息可以快速定位message和確定response的最大大小。
(3).通過index元數據全部映射到memory,可以避免segment file的IO磁盤操作。
(4).通過索引文件稀疏存儲,可以大幅降低index文件元數據占用空間大小。

9.Kafka 與傳統消息系統之間有三個關鍵區別
(1).Kafka 持久化日志,這些日志可以被重復讀取和無限期保留
(2).Kafka 是一個分布式系統:它以集群的方式運行,可以靈活伸縮,在內部通過復制數據提升容錯能力和高可用性
(3).Kafka 支持實時的流式處理

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

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

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

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

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

15.消費者負載均衡策略
一個消費者組中的一個分片對應一個消費者成員,他能保證每個消費者成員都能訪問,如果組中成員太多會有空閑的成員

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM