1. 程式人生 > 其它 >Kafka面試題(未完待續...)

Kafka面試題(未完待續...)

什麼是Kafka

傳統定義:Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,它可以處理消費者在網站中的所有動作流資料。

最新定義:Kafka是 一個開源的分散式事件流平臺 (Event Streaming Platform),被數千家公司用於高效能資料管道、流分析、資料整合和關鍵任務應用。

為什麼要用訊息佇列

1. 解耦

允許你獨立的擴充套件或修改兩邊的處理過程,只要確保它們遵守同樣的介面約束。

2. 可恢復性

系統的一部分元件失效時,不會影響到整個系統。訊息佇列降低了程序間的耦合度,所以即使一個處理 訊息的程序掛掉,加入佇列中的訊息仍然可以在系統恢復後被處理。

3. 緩衝

有助於控制和優化資料流經過系統的速度,解決生產訊息和消費訊息的處理速度不一致的情況。

4. 靈活性與峰值處理能力

在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見。如果為以能處理 這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用訊息佇列能夠使關鍵元件頂住突發的 訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。

5. 非同步通訊

很多時候,使用者不想也不需要立即處理訊息。訊息佇列提供了非同步處理機制,允許使用者把一個訊息放入 佇列,但並不立即處理它。想向佇列中放入多少訊息就放多少,然後在需要的時候再去處理它們。

Kafka 基礎架構

(1)Producer:訊息生產者,就是向 Kafka broker 發訊息的客戶端。

(2)Consumer:訊息消費者,向 Kafka broker 取訊息的客戶端。

(3)Consumer Group(CG):消費者組,由多個 consumer 組成。消費者組內每個消 費者負責消費不同分割槽的資料,一個分割槽只能由一個組內消費者消費;消費者組之間互不 影響。所有的消費者都屬於某個消費者組,即消費者組是邏輯上的一個訂閱者。

(4)Broker:一臺 Kafka 伺服器就是一個 broker。一個叢集由多個 broker 組成。一個 broker 可以容納多個 topic。

(5)Topic:可以理解為一個佇列,生產者和消費者面向的都是一個 topic。

(6)Partition:為了實現擴充套件性,一個非常大的 topic 可以分佈到多個 broker(即服 務器)上,一個 topic 可以分為多個 partition,每個 partition 是一個有序的佇列。

(7)Replica:副本。一個 topic 的每個分割槽都有若干個副本,一個 Leader 和若干個 Follower。

(8)Leader:每個分割槽多個副本的“主”,生產者傳送資料的物件,以及消費者消費數 據的物件都是 Leader。

(9)Follower:每個分割槽多個副本中的“從”,實時從 Leader 中同步資料,保持和 Leader 資料的同步。Leader 發生故障時,某個 Follower 會成為新的 Leader。

kafka為什麼要分割槽

(1)便於合理使用儲存資源,每個Partition在一個Broker上儲存,可以把海量的資料按照分割槽切割成一 塊一塊資料儲存在多臺Broker上。合理控制分割槽的任務,可以實現負載均衡的效果。

(2)提高並行度,生產者可以以分割槽為單位傳送資料;消費者可以以分割槽為單位進行消費資料。

Kafka生產者分割槽策略

(1)指明 partition 的情況下,直接將指明的值直接作為partiton值。 

(2)沒有指明partition值但有key的情況下,將key的hash值與topic的 partition數進行取餘得到partition值;

(3)既沒有partition值又沒有key值的情況下,Kafka採用Sticky Partition(黏性分割槽器),隨機選擇單個分割槽傳送所有的無Key訊息。一旦這個分割槽的batch已滿或處於“已完成”狀態,黏性分割槽器會隨機地選擇另一個分割槽並會盡可能地堅持使用該分割槽——即所謂的粘住這個分割槽。這樣,一旦我們拉長整個執行時間,訊息還是能均勻地釋出到各個分割槽上,避免出現分割槽傾斜,同時Producer還能降低延時,因為這個分配過程中始終能確保形成較大的batch,而非小batch。

ack應答機制

為保證producer傳送的資料,能可靠的傳送到指定的topic,topic的每個partition收到producer傳送的 資料後,都需要向producer傳送ack(acknowledgement確認收到),如果producer收到ack,就會進 行下一輪的傳送,否則重新發送資料。Kafka為使用者提供了三種可靠性級別,使用者根據對可靠性和延遲的要求進行權衡,選擇以下的配置。

acks引數配置:

0:producer不等待broker的ack,這一操作提供了一個最低的延遲,broker一接收到還沒有寫入 磁碟就已經返回,當broker故障時有可能丟失資料。

1:producer等待broker的ack,partition的leader落盤成功後返回ack,如果在follower同步成功 之前leader故障,那麼將會丟失資料

-1(all):producer等待broker的ack,partition的leader和follower全部落盤成功後才返回ack。 但是如果在follower同步完成後,broker傳送ack之前,leader發生故障,那麼會造成資料重複。

資料傳遞語義

至少一次(At Least Once)= ACK級別設定為-1 + 分割槽副本大於等於2 + ISR裡應答的最小副本數量大於等於2 (保證資料不丟失

最多一次(At Most Once)= ACK級別設定為0 (保證資料不重複

精確一次(Exactly Once)= 冪等性(PID, Partition, SeqNumber) + 至少一次  (保證單分割槽單會話內資料不重複)