程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

X:怎麼了?看起來心情不太好的亞子?

程序員:昨天去面試,被一個面試官懟了

X:還有這種事?

程序員:是啊,我也沒想到,我都以爲面試一切順利了,結果二面的時候被那個面試官逮了!

X:怎麼回事啊?

程序員:我之前做簡歷的時候,爲了讓技能這一塊豐富好看點,寫有Java基礎紮實、會用JVM啥的、瞭解分佈式、Zookeeper註冊中心,也就加了一個熟悉kafka,然後,面試官就逮着kafka問

X:你熟悉的話,應該就沒什麼問題啊?

程序員:我寫的是熟悉,不是精通,問一些概念原理我都答了,接下來就是Kafka 數據存儲設計、生產者設計、消費者設計,一通問,唉~


下面霸哥就來跟大家分享一下有關於kafka的核心技術知識,掌握了這些,是熟悉,還是精通,你們說了算!

注意:以下內容摘自一份283頁的pdf,《Java核心技術點》↓看文末

點我獲取文中資料

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

等等...

Kafka 概念

Kafka 是一種高吞吐量、分佈式、基於發佈/訂閱的消息系統,最初由 LinkedIn 公司開發,使用Scala 語言編寫,目前是 Apache 的開源項目。

1. broker:Kafka 服務器,負責消息存儲和轉發;

2. topic:消息類別,Kafka 按照 topic 來分類消息;

3. partition:topic 的分區,一個 topic 可以包含多個 partition,topic 消息保存在各個partition 上;

4. offset:消息在日誌中的位置,可以理解是消息在 partition 上的偏移量,也是代表該消息的唯一序號;

5. Producer:消息生產者;

6. Consumer:消息消費者;

7. Consumer Group:消費者分組,每個 Consumer 必須屬於一個 group;

8. Zookeeper:保存着集羣 broker、topic、partition 等 meta 數據;另外,還負責 broker 故障發現,partition leader 選舉,負載均衡等功能;

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

Kafka 數據存儲設計

1、partition 的數據文件(offset,MessageSize,data)

partition 中的每條 Message 包含了以下三個屬性:offset,MessageSize,data,其中 offset 表示 Message 在這個 partition 中的偏移量,offset 不是該 Message 在 partition 數據文件中的實際存儲位置,而是邏輯上一個值,它唯一確定了 partition 中的一條 Message,可以認爲 offset 是partition 中 Message 的 id;MessageSize 表示消息內容 data 的大小;data 爲 Message 的具體內容。

2、數據文件分段 segment(順序讀寫、分段命令、二分查找)

partition 物理上由多個 segment 文件組成,每個 segment 大小相等,順序讀寫。每個 segment數據文件以該段中最小的 offset 命名,文件擴展名爲.log。這樣在查找指定 offset 的 Message 的時候,用二分查找就可以定位到該 Message 在哪個 segment 數據文件中。

3、數據文件索引(分段索引、稀疏存儲)

Kafka 爲每個分段後的數據文件建立了索引文件,文件名與數據文件的名字是一樣的,只是文件擴展名爲.index。index 文件中並沒有爲數據文件中的每條 Message 建立索引,而是採用了稀疏存儲的方式,每隔一定字節的數據建立一條索引。這樣避免了索引文件佔用過多的空間,從而可以將索引文件保留在內存中。

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

生產者設計

1、負載均衡(partition 會均衡分佈到不同 broker 上)

由於消息 topic 由多個 partition 組成,且 partition 會均衡分佈到不同 broker 上,因此,爲了有效利用 broker 集羣的性能,提高消息的吞吐量,producer 可以通過隨機或者 hash 等方式,將消息平均發送到多個 partition 上,以實現負載均衡。

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

2、批量發送

是提高消息吞吐量重要的方式,Producer 端可以在內存中合併多條消息後,以一次請求的方式發送了批量的消息給 broker,從而大大減少 broker 存儲消息的 IO 操作次數。但也一定程度上影響了消息的實時性,相當於以時延代價,換取更好的吞吐量。

3、壓縮(GZIP 或 Snappy)

Producer 端可以通過 GZIP 或 Snappy 格式對消息集合進行壓縮。Producer 端進行壓縮之後,在Consumer 端需進行解壓。壓縮的好處就是減少傳輸的數據量,減輕對網絡傳輸的壓力,在對大數據處理上,瓶頸往往體現在網絡上而不是 CPU(壓縮和解壓會耗掉部分 CPU 資源)。

消費者設計

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

Consumer Group

同一 Consumer Group 中的多個 Consumer 實例,不同時消費同一個 partition,等效於隊列模式。partition 內消息是有序的,Consumer 通過 pull 方式消費消息。Kafka 不刪除已消費的消息對於 partition,順序讀寫磁盤數據,以時間複雜度 O(1)方式提供消息持久化能力。

更多內容

多線程併發系列

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

Spring原理系列

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

微服務系列

程序員:我就在簡歷上寫了熟悉kafka,結果面試官就逮着問,硬問

 

等等,內容涵蓋:Java、MyBatis、ZooKeeper、Dubbo、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux、併發編程、微服務等技術棧。

需要的朋友可以關注公衆號獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章