談一談Kafka的那些事

面向面試的博客,以問答式Q/A方式呈現。


Question1:簡單介紹一下你對 Kafka 的理解?

Answer1:

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

附:
高吞吐量:生產者發送數據的時候採用壓縮的方式來減少傳輸的數據量,減輕對網絡傳輸的壓力,採用批量發送的方式來減少 broker 存儲消息的 IO 操作次數,獲得更大的吞吐量。
高可用:同一個Partition的Replica副本儘量分散到不同的機器,保證高可用,不會因爲某一個broker故障影響整體。

在這裏插入圖片描述

圖中概念解釋:
Partitioned Data Pubilcation:分區數據發佈;Ordered Subscription:訂購;
TopicA-part0:表示TopicA-partition0,同理,TopicA-part1 表示TopicA-partition1,TopicA-part2 表示 TopicA-partition2,同一個partition只能有一個leader,由zookeeper負責partition中leader的選舉。
圖中內容解釋:
一個Topic可以包含多個partition,如圖所示,同時注意,同一個Partition的Replica副本儘量分散到不同的機器,保證高可用,圖中TopicA-part0在左邊和中間兩個broker上,圖中TopicA-part1在中間和右邊兩個broker上,圖中TopicA-part2在左邊和右邊兩個broker上,都不會在同一個broker上的,體現Kafka高可用。

  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 選舉,負載均衡等功能。

Question2:介紹一下 Kafka 數據存儲結構?

Answer2:

Kafka 數據存儲結構包括 partition數據文件、segment數據文件、數據索引文件,如下:

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 的具體內容。

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

順序讀寫:partition 物理上由多個 segment 文件組成,每個 segment 大小相等,順序讀寫。

分段命令:每個 segment數據文件以該段中最小的 offset 命名,文件擴展名爲.log。

二分查找:這樣在查找指定 offset 的 Message 的時候,用二分查找就可以定位到該 Message 在哪個 segment 數據文件中。

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

分段索引:Kafka 爲每個分段後的數據文件建立了索引文件,文件名與數據文件的名字是一樣的,只是文件擴展名爲.index。

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

索引文件和數據文件對應關係,如下圖所示:
在這裏插入圖片描述

左邊.index是索引文件,右邊.log是數據文件。


Question3:簡要闡述一下 Kafka 生產者設計?

Answer3:

Kafka 生產者設計架構,如下圖所示:
在這裏插入圖片描述
1、負載均衡(partition 會均衡分佈到不同 broker 上)

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

2、批量發送

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

3、壓縮( GZIP 或 Snappy )

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


Question4:簡要闡述一下 Kafka 消費者設計?

Answer4:

Kafka 消費者設計架構,如下圖所示:
在這裏插入圖片描述
同一 Consumer Group 中的多個 Consumer 實例,不同時消費同一個 partition,等效於隊列模式。partition 內消息是有序的,Consumer 通過 pull 方式消費消息。Kafka 不刪除已消費的消息。對於 partition,順序讀寫磁盤數據,以時間複雜度 O(1)方式提供消息持久化能力。

在這裏插入圖片描述

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