首頁  >  文章  >  Java  >  從面試角度一文學完 Kafka

從面試角度一文學完 Kafka

Java后端技术全栈
Java后端技术全栈轉載
2023-08-24 15:22:041013瀏覽

Kafka 是一個優秀的分散式訊息中間件,許多系統中都會使用到 Kafka 來做訊息通訊。對分散式訊息系統的了解和使用幾乎成為一個後台開發人員必備的技能。今天碼哥字節就從常見的 Kafka 面試題入手,和大家聊聊 Kafka 的那些事兒。

從面試角度一文學完 Kafka
心智圖

講一講分散式訊息中間件

#問題

  • 什麼是分散式訊息中間件?
  • 訊息中間件的作用是什麼?
  • 訊息中間件的使用場景是什麼?
  • 訊息中間件選型?
從面試角度一文學完 Kafka
訊息佇列

分散式訊息是一種通訊機制,和RPC、HTTP、RMI 等不一樣,訊息中間件採用分散式中間代理的方式進行通訊。如圖所示,採用了訊息中間件之後,上游業務系統發送訊息,先儲存在訊息中間件,然後由訊息中間件將訊息分發到對應的業務模組應用(分散式生產者 - 消費者模式)。這種非同步的方式,減少了服務之間的耦合程度。

從面試角度一文學完 Kafka
架構

定義訊息中間件:

  • 利用高效可靠的訊息傳遞機制進行平台無關的資料交流
  • #基於資料通信,來進行分散式系統的整合
  • #透過提供訊息傳遞和訊息排隊模型,可以在分散式環境下擴展進程間的通訊

在系統架構中引用額外的元件,必然提高系統的架構複雜度和維運的難度,那麼在系統中使用分散式訊息中間件有什麼優點呢?訊息中間件在系統中扮演的角色又是什麼呢?

  • 解耦
  • 冗餘(儲存)
  • 擴展性
  • 削峰
  • #可恢復性
  • 順序保證

##緩衝############非同步通訊#############面試時,面試官常常關心面試者對開源元件的選用能力,這既可以考驗面試者知識的廣度,也可以考驗面試者對某一類系統的知識的認識深度,也可以看出面試者對系統整體掌握和系統架構設計的能力。開源分散式訊息系統很多,不同的訊息系統的特性也不一樣,選擇怎樣的訊息系統,不僅需要對各訊息系統有一定的了解,也需要對自身系統需求有清楚的認知。 #########以下是常見的幾種分散式訊息系統的對比:######
從面試角度一文學完 Kafka
選擇

答案關鍵字

  • #什麼是分散式訊息中間件?通信,隊列,分佈式,生產消費者模式。
  • 訊息中間件的作用是什麼?解耦、峰值處理、非同步通訊、緩衝。
  • 訊息中間件的使用場景是什麼?非同步通信,訊息存儲處理。
  • 訊息中間件選型?語言,協定、HA、資料可靠性、效能、事務、生態、簡易、推拉模式。

Kafka 基本概念與架構

問題

  • #簡單講下Kafka 的架構?
  • Kafka 是推模式還是拉模式,推拉的差異是什麼?
  • Kafka 如何廣播訊息?
  • Kafka 的訊息是否是有順序的?
  • Kafka 是否支援讀寫分離?
  • Kafka 如何保證資料高可用?
  • Kafka 中 zookeeper 的作用?

是否支援事務?

###分割區數是否可以減少? ###############Kafka 架構中的一般概念:#######
從面試角度一文學完 Kafka
架構
  • Producer:生產者,也就是發送訊息的一方。生產者負責建立訊息,然後將其發送到 Kafka。
  • Consumer:消費者,也就是接受訊息的一方。消費者連接到 Kafka 上並接收訊息,進而進行相應的業務邏輯處理。
  • Consumer Group:一個消費者群組可以包含一個或多個消費者。使用多分區 多消費者方式可以大幅提高資料下游的處理速度,同一消費組的消費者不會重複消費訊息,同樣的,不同消費組的消費者訊息訊息時互不影響。 Kafka 就是透過消費群組的方式來實現訊息 P2P 模式和廣播模式。
  • Broker:服務代理節點。 Broker 是 Kafka 的服務節點,即 Kafka 的伺服器。
  • Topic:Kafka 中的訊息以 Topic 為單位劃分,生產者將訊息傳送到特定的 Topic,而消費者負責訂閱 Topic 的訊息並進行消費。
  • Partition:Topic 是一個邏輯的概念,它可以細分為多個分區,每個分區只屬於單一主題。同一個主題下不同分區包含的訊息是不同的,分區在儲存層面可以看作一個可追加的日誌(Log)文件,訊息在被追加到分區日誌文件的時候都會分配一個特定的偏移量(offset )。
  • Offset:offset 是訊息在分區中的唯一標識,Kafka 透過它來保證訊息在分區內的順序性,不過offset 並不跨越分區,也就是說,Kafka 保證的是分區有序性而不是主題有序性。
  • Replication:副本,是Kafka 保證資料高可用的方式,Kafka 同一Partition 的資料可以在多Broker 上存在多個副本,通常只有主副本對外提供讀寫服務,當主副本所在broker 崩潰或發生網路一場,Kafka 會在Controller 的管理下會重新選擇新的Leader 副本對外提供讀寫服務。
  • Record:實際寫入 Kafka 中並且可以被讀取的訊息記錄。每個 record 包含了 key、value 和 timestamp。

Kafka Topic Partitions Layout

從面試角度一文學完 Kafka
主題

Kafka 將Topic 進行分區,分區可以並發讀寫。

Kafka Consumer Offset

#
從面試角度一文學完 Kafka
consumer offset

zookeeper

從面試角度一文學完 Kafka
zookeeper
  • Broker 註冊:Broker 是分散式部署並且之間相互獨立,Zookeeper 用來管理註冊到叢集的所有Broker 節點。
  • Topic 註冊:在Kafka 中,同一個Topic 的訊息會被分成多個分區並將其分佈在多個Broker 上,這些分區資訊及與Broker 的對應關係也都是由Zookeeper 在維護
  • 生產者負載平衡:由於同一個Topic 訊息會被分區並將其分佈在多個Broker 上,因此,生產者需要將訊息合理地發送到這些分散式的Broker 上。
  • 消費者負載平衡:與生產者類似,Kafka 中的消費者同樣需要進行負載平衡來實現多個消費者合理地從對應的Broker 伺服器上接收訊息,每個消費者分組包含若干消費者,每個訊息只會傳送給分組中的一個消費者,不同的消費者分組消費自己特定的Topic 下面的訊息,互不干擾。

答案關鍵字

  • #簡單地說出 Kafka 的架構?

    Producer、Consumer、Consumer Group、Topic、Partition

  • Kafka 是推模式還是拉模式,推拉的差別是什麼?

    Kafka Producer 向 Broker 發送訊息使用 Push 模式,Consumer 消費採用的 Pull 模式。拉取模式,讓 consumer 自己管理 offset,可以提供讀取效能

  • Kafka 如何廣播訊息?

    Consumer group

  • Kafka 的訊息是否是有順序的?

    Topic 層級無序,Partition 有序

  • Kafka 是否支援讀寫分離?

    不支持,只有 Leader 對外提供讀寫服務

  • #Kafka 如何保證資料高可用?

    副本,ack,HW

  • #Kafka 中 zookeeper 的作用?

    叢集管理,元資料管理

  • 是否支援交易?

    0.11 後支援事務,可以實現」exactly once「

  • 分割區數是否可以減少?

    不可以,會遺失資料

Kafka 使用

  • Kafka 有哪些命令列工具?你用過哪些?
  • Kafka Producer 的執行過程?
  • Kafka Producer 有哪些常見設定?
  • 如何讓 Kafka 的訊息有順序?
  • Producer 如何保證資料發送不遺失?
  • 如何提升 Producer 的效能?
  • 如果同一 group 下 consumer 的數量大於 part 的數量,kafka 如何處理?
  • Kafka Consumer 是否是執行緒安全的?
  • 來講一下你使用 Kafka Consumer 消費訊息時的執行緒模型,為何如此設計?
  • Kafka Consumer 的常見設定?
  • Consumer 什麼時候會被踢出集群?
  • 當有 Consumer 加入或退出時,Kafka 會如何反應?
  • 什麼是 Rebalance,何時會發生 Rebalance?

命令列工具

#Kafka 的命令列工具在Kafka 套件的/bin#目錄下,主要包括服務和叢集管理腳本,配置腳本,資訊檢視腳本,Topic 腳本,客戶端腳本等。

  • kafka-configs.sh:設定管理腳本
  • kafka-console-consumer.sh:kafka 消費者控制台
  • #kafka-console-producer.sh:kafka 生產者控制台
  • kafka-consumer-groups.sh:kafka 消費者群組相關資訊
  • kafka-delete-records.sh:刪除低水位的日誌檔案
  • #kafka-log-dirs.sh:kafka 訊息日誌目錄資訊
  • kafka-mirror-maker.sh:不同資料中心kafka 叢集複製工具
  • kafka-preferred-replica-election.sh:觸發preferred replica 選舉
  • kafka-producer-perf-test.sh:kafka 生產者效能測試腳本
  • kafka-reassign-partitions.sh:分區重新分配腳本
  • kafka-replica-verification.sh:複製進度驗證腳本
  • kafka-server-start.sh:啟動kafka 服務
  • kafka-server-stop.sh:停止kafka 服務
  • kafka-topics.sh:topic 管理腳本

############################################## ###kafka-verifiable-consumer.sh:可檢驗的kafka 消費者############kafka-verifiable-producer.sh:可檢驗的kafka 生產者######## #####zookeeper-server-start.sh:啟動zk 服務############zookeeper-server-stop.sh:停止zk 服務############ #zookeeper-shell.sh:zk 客戶端############我們通常可以使用###kafka-console-consumer.sh###和###kafka-console-producer.sh ###腳本來測試Kafka 生產和消費,###kafka-consumer-groups.sh###可以查看和管理叢集中的Topic,###kafka-topics.sh###通常用於查看Kafka 的消費組情況。 ###

Kafka Producer

Kafka producer 的正常生產邏輯包含以下步驟:

  1. 設定生產者客戶端參數常見生產者實例。
  2. 建立待發送的訊息。
  3. 發送訊息。
  4. 關閉生產者實例。

Producer 發送訊息的過程如下圖所示,需要經過攔截器序列化器分區器,最終由累加器批次發送至Broker。

從面試角度一文學完 Kafka
producer

Kafka Producer 需要以下必要參數:

  • bootstrap.server:指定Kafka 的Broker 的位址
  • key.serializer:key 序列化器
  • value.serializer:value 序列化器

#常見參數:

  • batch.num.messages

    預設值:200,每次批次訊息的數量,只對asyc起作用。

  • request.required.acks

    預設值:0,0 表示 producer 毋須等待 leader 的確認,1 代表需要 leader 確認寫入它的本地 log 並立即確認,-1 代表所有的備份都完成後確認。只對 async 模式起作用,這個參數的調整是資料不遺失和發送效率的 tradeoff,如果對資料遺失不敏感而在乎效率的場景可以考慮設定為 0,這樣可以大大提高 producer 發送資料的效率。

  • request.timeout.ms

    #預設值:10000,確認逾時時間。

  • partitioner.class

    預設值:kafka.producer.DefaultPartitioner,必須實作kafka.producer.Partitioner,根據Key 提供一個分區策略。 有時候我們需要相同類型的消息必須順序處理,這樣我們就必須自訂分配策略,從而將相同類型的資料分配到同一個分區中。

  • producer.type

    預設值:sync,指定訊息傳送是同步還是非同步。非同步 asyc 成批發送用 kafka.producer.AyncProducer, 同步 sync 用 kafka.producer.SyncProducer。同步和非同步發送也會影響訊息生產的效率。

  • compression.topic

    #預設值:none,訊息壓縮,預設不壓縮。其餘壓縮方式還有,"gzip"、"snappy"和"lz4"。訊息的壓縮可以大幅減少網路傳輸量、降低網路 IO,從而提高整體效能。

  • compressed.topics

    預設值:null,在設定了壓縮的情況下,可以指定特定的 topic 壓縮,未指定則全部壓縮。

  • message.send.max.retries

    預設值:3,訊息傳送最大嘗試次數。

  • retry.backoff.ms

    #預設值:300,每次嘗試增加的額外的間隔時間。

  • topic.metadata.refresh.interval.ms

    預設值:600000,定期的取得元資料的時間。當分割區遺失,leader 不可用時 producer 也會主動取得元數據,如果為 0,則每次發送完訊息就會取得元數據,不建議。如果為負值,則只有在失敗的情況下取得元資料。

  • queue.buffering.max.ms

    預設值:5000,在producer queue 的快取的資料最大時間,僅僅for asyc。

  • queue.buffering.max.message

    預設值:10000,producer 快取的訊息的最大數量,僅僅for asyc。

  • queue.enqueue.timeout.ms

    預設值:-1,0 當 queue 滿時丟掉,負值是 queue 滿時 block, 正值是 queue 滿時 block 對應的時間,僅僅 for asyc。

Kafka Consumer

Kafka 有消費群組的概念,每個消費者只能消費所分配到的分區的消息,每一個分區只能被一個消費組中的一個消費者所消費,所以同一個消費組中消費者的數量如果超過了分區的數量,將會出現有些消費者分配不到消費的分區。消費群組與消費者關係如下圖所示:

從面試角度一文學完 Kafka
consumer group

Kafka Consumer Client 消費訊息通常包含以下步驟:

  1. #設定客戶端,建立消費者
  2. 訂閱主題
  3. 拉去訊息並消費
  4. #提交消費位移
  5. 關閉消費者實例
從面試角度一文學完 Kafka

################################################ ###因為Kafka 的Consumer 用戶端是線程不安全的,為了確保線程安全,並提升消費性能,可以在Consumer 端採用類似Reactor 的線程模型來消費資料。 ###
從面試角度一文學完 Kafka
消費模型

Kafka consumer 參數

  • bootstrap.servers :連接broker 位址,host:port 格式。
  • group.id:消費者隸屬的消費群組。
  • key.deserializer:與生產者的key.serializer對應,key 的反序列化方式。
  • value.deserializer:與生產者的value.serializer對應,value 的反序列化方式。
  • session.timeout.ms:coordinator 偵測失敗的時間。預設 10s 此參數是 Consumer Group 主動偵測 (組內成員 comsummer) 崩潰的時間間隔,類似於心跳過期時間。
  • auto.offset.reset:此屬性指定了消費者在讀取一個沒有偏移量後者偏移量無效(消費者長時間失效當前的偏移量已經過時並且被刪除了)的分區的情況下,應該作何處理,預設值是latest,也就是從最新記錄讀取資料(消費者啟動之後產生的記錄),另一個值是earliest,意思是在偏移量無效的情況下,消費者從起始位置開始讀取資料。
  • enable.auto.commit:否自動提交位移,如果為false,則需要在程式中手動提交位移。對於精確到一次的語義,最好手動提交位移
  • fetch.max.bytes:單次拉取資料的最大位元組數量
  • max.poll.records:單次poll 呼叫傳回的最大訊息數,如果處理邏輯很輕量,可以適當地提高該值。但是max.poll.records條資料需要在 session.timeout.ms 這個時間內處理完 。預設值為 500
  • request.timeout.ms:一次請求回應的最長等待時間。如果在逾時時間內未得到回應,kafka 要麼重發這則訊息,要麼超過重試次數的情況下直接置為失敗。

Kafka Rebalance

#rebalance 本質上是一種協議,規定了一個consumer group 下的所有consumer 如何達成協議來分配訂閱topic 的每個分區。例如某個 group 下有 20 個 consumer,它訂閱了一個有 100 個分割區的 topic。正常情況下,Kafka 平均會為每個 consumer 指派 5 個分割區。這個分配的過程就叫做 rebalance。

什麼時候 rebalance?

這也是常被提及的問題。 rebalance 的觸發條件有三種:

  • 群組成員發生變更(新consumer 加入群組、已有consumer 主動離開群組或已有consumer 崩潰了—這兩者的區別後面會談到)
  • 訂閱主題數發生變更
  • #訂閱主題的分區數發生變更

如何進行群組內分割區分配?

Kafka 預設提供了兩種指派策略:Range 和 Round-Robin。當然 Kafka 採用了可插拔式的分配策略,你可以建立自己的分配器來實現不同的分配策略。

答案關鍵字

  • Kafka 有哪些命令列工具?你用過哪些? /bin目錄,管理 kafka 叢集、管理 topic、生產和消費 kafka
  • Kafka Producer 的執行過程?攔截器,序列化器,分區器和累加器
  • Kafka Producer 有哪些常見配置? broker 配置,ack 配置,網路和發送參數,壓縮參數,ack 參數
  • 如何讓 Kafka 的訊息有序? Kafka 在Topic 層級本身是無序的,只有partition 上才有序,所以為了確保處理順序,可以自訂分區器,將需順序處理的資料傳送到同一個partition
  • Producer 如何保證資料發送不遺失? ack 機制,重試機制
  • 如何提升 Producer 的效能?批量,異步,壓縮
  • 如果同一 group 下 consumer 的數量大於 part 的數量,kafka 如何處理?多餘的 Part 將處於無用狀態,不消費資料
  • Kafka Consumer 是否是執行緒安全的?不安全,單執行緒消費,多執行緒處理
  • 講一下你使用 Kafka Consumer 消費訊息時的執行緒模型,為何如此設計?拉取和處理分離
  • Kafka Consumer 的常見配置? broker, 網路和拉取參數,心跳參數
  • Consumer 什麼時候會被踢出集群?奔潰,網路異常,處理時間過長提交位移超時
  • 當有 Consumer 加入或退出時,Kafka 會作何反應?進行 Rebalance
  • 什麼是 Rebalance,何時會發生 Rebalance? topic 變化,consumer 變化

高可用和效能

##問題

  • Kafka 如何保證高可用?
  • Kafka 的交付語意?
  • Replic 的作用?
  • 什麼事 AR,ISR?
  • Leader 和 Flower 是什麼?
  • Kafka 中的 HW、LEO、LSO、LW 等分別代表什麼?
  • Kafka 為確保優越的效能做了哪些處理?
  • 分割區與副本

    從面試角度一文學完 Kafka
    #分割區副本

    在分散式資料系統中,通常使用分區來提高系統的處理能力,透過副本來確保資料的高可用性。多分區意味著並發處理的能力,這多個副本中,只有一個是 leader,而其他的都是 follower 副本。僅有 leader 副本可以對外提供服務。多個 follower 副本通常存放在和 leader 副本不同的 broker 中。透過這樣的機制實現了高可用,當某台機器掛掉後,其他 follower 副本也能迅速」轉正“,開始對外提供服務。

    為什麼 follower 副本不提供讀取服務?

    這個問題本質上是對效能和一致性的取捨。試想一下,如果 follower 副本也對外提供服務那會怎麼樣呢?首先,性能是肯定會有所提升的。但同時,會出現一系列問題。類似資料庫事務中的幻讀,髒讀。例如你現在寫入一條數據到 kafka 主題 a,消費者 b 從主題 a 消費數據,卻發現消費不到,因為消費者 b 去讀取的那個分區副本中,最新消息還沒寫入。而這時候,另一個消費者 c 卻可以消費到最新那條數據,因為它消費了 leader 副本。 Kafka 透過 WH 和 Offset 的管理來決定 Consumer 可以消費哪些數據,已經目前寫入的數據。

    從面試角度一文學完 Kafka
    watermark

    只有Leader 可以對外提供讀取服務,那如何選舉Leader

    kafka 會與leader 副本保持同步的副本放到ISR 副本集合中。當然,leader 副本是一直存在於 ISR 副本集合中的,在某些特殊情況下,ISR 副本中甚至只有 leader 一個副本。當 leader 掛掉時,kakfa 透過 zookeeper 感知到這一情況,在 ISR 副本中選取新的副本成為 leader,對外提供服務。但這樣還有一個問題,前面提到過,有可能 ISR 副本集合中,只有 leader,當 leader 副本掛掉後,ISR 集合就為空,這時候怎麼辦呢?這時候如果設定 unclean.leader.election.enable 參數為 true,那麼 kafka 會在非同步,也就是不在 ISR 副本集合中的副本中,選取出副本變成 leader。

    副本的存在就會出現副本同步問題

    #

    Kafka 在所有分配的副本(AR) 中維護一個可用的副本清單(ISR),Producer 向Broker 發送訊息時會根據ack配置來確定需要等待幾個副本已經同步了訊息才相應成功,Broker 內部會ReplicaManager服務來管理flower 與leader 之間的資料同步。

    從面試角度一文學完 Kafka
    sync

    效能最佳化

    • partition 並發
    • 順序讀寫磁碟
    • page cache:按頁讀寫
    • 預讀: Kafka 會將要消費的訊息提前讀入記憶體
    • 高效能序列化(二進位)
    • 記憶體對映
    • 無鎖定offset 管理:提高並發能力
    • Java NIO 模型
    • 批次:批次讀寫
    • 壓縮:訊息壓縮,儲存壓縮,減少網路和IO 開銷

    Partition 並發

    一方面,由於不同Partition 可位於不同機器,因此可以充分利用叢集優勢,實現機器間的並行處理。另一方面,由於Partition 在物理上對應一個資料夾,即使多個Partition 位於同一個節點,也可透過配置讓同一節點上的不同Partition 置於不同的disk drive 上,從而實現磁碟間的並行處理,充分發揮多磁碟的優勢。

    順序讀寫

    Kafka 每一個partition 目錄下的檔案被平均切割成大小相等(預設一個檔案是500 兆,可以手動去設定)的數據文件, 每一個資料檔都稱為一個段(segment file), 每個 segment 都採用 append 的方式追加資料。

    從面試角度一文學完 Kafka
    追加資料

    答案關鍵字

    • Kafka 如何保證高可用?

      透過副本來保證資料的高可用,producer ack、重試、自動Leader 選舉,Consumer 自平衡

      Kafka 的交付語意?
    • 交付語意一般有
      at least once

      at most once

      exactly once

      。 kafka 透過 ack 的配置來實現前兩種。
    • Replic 的作用? #########實作資料的高可用######################什麼是 AR,ISR? ###

      AR:Assigned Replicas。 AR 是主題建立後,分區建立時被指派的副本集合,副本個 數由副本因子決定。 ISR:In-Sync Replicas。 Kafka 中特別重要的概念,指涉的是 AR 中那些與 Leader 保 持同步的副本集合。在 AR 中的副本可能不在 ISR 中,但 Leader 副本天然就包含在 ISR 中。關於 ISR,還有一個常見的面試題目是如何判斷副本是否應該屬於 ISR。目前的判斷 依據是:Follower 副本的 LEO 落後 Leader LEO 的時間,是否超過了 Broker 端參數 replica.lag.time.max.ms 值。如果超過了,副本就會被從 ISR 移除。

    • Leader 和 Flower 是什麼?

    • Kafka 中的 HW 代表什麼?

      高水位值 (High watermark)。這是控制消費者可讀取訊息範圍的重要欄位。一 個一般消費者只能「看見」Leader 副本上介於 Log Start Offset 和 HW(不含)之間的 所有訊息。水位以上的訊息是對消費者不可見的。

    • Kafka 為保證優越的效能做了哪些處理?

      partition 並發、順序讀寫磁碟、page cache 壓縮、高效能序列化(二進位)、記憶體對映無鎖定offset 管理、Java NIO 模型

    #本文並沒有深入Kafka 的實現細節和源碼分析,但Kafka 確實是一個優秀的開源系統,很多優雅的架構設計和源碼設計都值得我們學習,十分建議感興趣的同學更加深入的去了解這個開源系統,對於自身架構設計能力,編碼能力,效能最佳化都會有很大的幫助。

    #

    以上是從面試角度一文學完 Kafka的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:Java后端技术全栈。如有侵權,請聯絡admin@php.cn刪除