kafka常見面試題

2021-10-02 15:54:48 字數 2819 閱讀 4502

ar:所有的分割槽副本;

isr:所有與leader保持同步的副本集合;

osr:被leader剔除isr的集合;當副本在一定時間未與leader進行同步就會被提出isr。

leo:每個副本中最大的 offset;

hw:消費者能見到的最大的 offset,isr中最小的leo;

kafka的分割槽每次寫入訊息是都是有序的(末尾追加);消費時,每個分割槽只能被同乙個消費者組中的乙個消費者消費,從而保證了訊息的順序行。

分割槽器:根據鍵值確定訊息放在哪個分割槽,預設試用輪詢演算法,也可以自定義分割槽器;

序列化器:鍵序列化器和值序列化器,將鍵和值都轉為二進位製流 還有反序列化器 將二進位制流轉為指定型別資料;

***:兩個方法 dosend()方法會在序列化之前完成 onacknowledgement()方法在訊息傳送成功或失敗時呼叫 可以新增多個***按順序執行。

執行順序:***dosend() -> 序列化器 -> 分割槽器

整個生產者客戶端由兩個執行緒協調執行,這兩個執行緒分別為主執行緒和sender執行緒(傳送執行緒)。在主線程中由kafkaproducer建立訊息,然後通過可能的***、序列化器和分割槽器的作用之後快取到訊息累加器(recordaccumulator,也稱為訊息收集器)中。sender執行緒負責從recordaccumulator中獲取訊息並將其傳送到kafka中。

recordaccumulator主要用來快取訊息以便sender執行緒可以批量傳送,進而減少網路傳輸的資源消耗提公升效能。recordaccumulator快取的大小可以通過生產者客戶端引數buffer.memory的配置,預設值為32mb。如果生產者傳送訊息的速度超過傳送到伺服器的速度,則會導致生產者空間不足,這個時候kafkaproducer的send()方法呼叫要麼被阻塞,要麼丟擲異常,這個取決於引數max.block.ms的配置,此引數的預設值為60000,即60秒。

正確;同乙個分割槽只能被同乙個消費者組中的乙個消費者消費。
offset+1。

消費者消費後沒有commit offset(程式崩潰/強行kill/消費耗時/自動提交偏移情況下unscrible)。

消費者沒有處理完訊息 提交offset(自動提交偏移 未處理情況下程式異常結束)

1)會在 zookeeper 中的/brokers/topics 節點下建立乙個新的 topic 節點,如:

/brokers/topics/first

2)觸發 controller 的監聽程式

3)kafka controller 負責 topic 的建立工作,並更新 metadata cache 。

可以。命令:bin/kafka-topics.sh --zookeeper node02:2181 --alter --topic second --partitions 3

不能,會丟失資料。
__consumer_offsets 以雙下劃線開頭,儲存消費組的偏移
每個partition乙個資料夾,包含四類檔案.index .log .timeindex leader-epoch-checkpoint

.index .log .timeindex 三個檔案成對出現 字首為上乙個segment的最後乙個訊息的偏移 log檔案中儲存了所有的訊息 index檔案中儲存了稀疏的相對偏移的索引 timeindex儲存的則是時間索引

leader-epoch-checkpoint中儲存了每一任leader開始寫入訊息時的offset 會定時更新

follower被選為leader時會根據這個確定哪些訊息可用

1.通過檔名字首數字x找到該絕對offset 對應訊息所在檔案

2.offset-x為在檔案中的相對偏移

3.通過index檔案中記錄的索引找到最近的訊息的位置

4.從最近位置開始逐條尋找

負責kafka集群的上下線工作,所有topic的副本分割槽分配和選舉leader工作

在isr中需要選擇,選擇策略為先到先得

失效副本為速率比leader相差大於10秒的follower

將失效的follower先剔除isr

等速率接近leader10秒內,再加進isr

首先副本數不能超過broker數

第一分區是隨機從broker中選擇乙個,然後其他分割槽相對於0號分割槽依次向後移

第乙個分割槽是從nextreplicashift決定的,而這個數也是隨機產生的

kafka事務有兩種

producer事務和consumer事務

producer事務是為了解決kafka跨分割槽跨會話問題

kafka不能跨分割槽跨會話的主要問題是每次啟動的producer的pid都是系統隨機給的

所以為了解決這個問題

我們就要手動給producer乙個全域性唯一的id,也就是transaction id 簡稱tid

我們將tid和pid進行繫結,在producer帶著tid和pid第一次向broker註冊時,broker就會記錄tid,並生成乙個新的元件__transaction_state用來儲存tid的事務狀態資訊

當producer重啟後,就會帶著tid和新的pid向broker發起請求,當發現tid一致時

producer就會獲取之前的pid,將覆蓋掉新的pid,並獲取上一次的事務狀態資訊,從而繼續上次工作

consumer事務相對於producer事務就弱一點,需要先確保consumer的消費和提交位置為一致且具有事務功能,才能保證資料的完整,不然會造成資料的丟失或重複

kafka常見面試題

1 為什麼要使用 kafka,為什麼要使用訊息佇列 緩衝和削峰 解耦和擴充套件性 冗餘 健壯性 非同步通訊 2 kafka的acks引數對訊息持久化的影響 往kafka寫資料的時候,就可以來設定這個acks引數。然後這個引數實際上有三種常見的值可以設定,分別是 0 1 和 all 等價於 1 api...

常見面試題

1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...

常見面試題

1 一行 實現1 100之和 lst i for i in range 1,101 print sum lst 2 如何在乙個函式內部修改全域性變數?在函式內部新增 global 變數名 這樣就可以在本地作用域定義全域性作用域了 name 大明 def eat name1 global name n...