本文為複習期間面試總結
從以下方面對kafka面試進行總結:基本原理架構/專案實踐/生產者/消費者/協調者/儲存層/控制器
基本原理架構
-
簡單講下什麼是kafka[一句話概括/架構圖]
-
訊息佇列選型 你們為什麼不選用其他訊息佇列
-
ZK 在訊息佇列中的作用是什麼
註冊中心[作為共享儲存儲存了kafka叢集和客戶端的相關資訊] -
broke ISR AR Topic Partition Offset ConsumerGroup
- Partition: kafka分割槽模型 每個分割槽都是一個有序的獨立的不可變的記錄序列,新的訊息會不斷-的追加到序列末尾,分割槽的offset都是從0開始。kafka只能保證訊息在單個分割槽的有序
- Offset:偏移量 通過offset+partition+topic可以定位到唯一一條訊息
- broke:訊息代理伺服器 可以認為是一臺獨立的機器
- Topic:訊息主題
- ConsumerGroup:消費者組
- ISR:副本冗餘[正在和主副本保持同步的備份副本 只要ISR中還有一個節點是存活的就能保證訊息不丟失 主副本和備份副本都有訊息,主掛可切換副]
- AR: 所有副本[包含主副本和正在同步的副本]
- OSR:被踢出ISR的叫OSR,當同步進度追上 會重新加入ISR
-
kafka有那些訊息模型
佇列模型和釋出訂閱 kafka使用消費者組統一了上面2種訊息模型。[佇列1對1/訂閱1對多]
-
kafka為什麼這麼快
追加方式寫入 producer層選擇分割槽並行寫入資料[避免全量訊息提交到協調階段在計算分割槽] 使用訊息batch[訊息批 減少通訊次數] -
kafka follower如何與leader同步資料
-
kafka節點之間訊息如何備份的
-
kafka訊息是否會丟失為什麼
-
kafka的lead選舉機制是什麼
-
kafka 的訊息保障方式有那些
專案實踐
-
ACK 0 -1 1分別代表什麼
- [-1] 也就all 需要等待ISR中所有都同步完成
- 1 預設的只需要等待主副本同步完成即可
- 0 不確認就開始傳送下一條訊息
-
你們使用了kafka事務嗎
-
訊息佇列丟失資料如何處理
這個問題可以分為三個方面 生產者 消費者 訊息佇列
- 生產者方面我們使用的非同步回撥的方式,在收到回撥的時候若訊息沒有傳送成功,我們會記錄再次傳送。
- 消費者 消費者的資料丟失可以認為是提交了offset但是資料處理失敗了,我們使用的手動提交在處理成功後在提交offset 不會遇到這個問題。但是要注意訊息處理時間不能過長,如果處理過長還沒提交offset管理者可能會認為當前消費者下線從而觸發reblance
- 訊息佇列資料丟失 我們在kafka配置了
ack = -1
要求所有ISR都確認同步了訊息才給producer傳送ack 所以可以保證訊息不會丟失。
生產者
-
生產者訊息傳送的幾種方式
同步阻塞 非同步非阻塞 [都是通過send方法實現的] -
生產者如何為訊息選取分割槽的
若訊息沒有設定key loadblance寫入partition。如設定了key
murmur2(key) mod PartitionNum
-
簡單講下生產者的工作流程
1.主執行緒將訊息封裝到ProducerRecord[partition/key/value/key/時間戳]
2.client對ProducerRecord進行序列化
3.根據分割槽策略確定分割槽[無key輪詢有key murmur2(key) mod PartitionNum]
4.將訊息放入快取區[每一個分割槽對應一個雙端佇列,] 由sender執行緒將一個批次的訊息batch的訊息傳送到對應的broker -
生產者如何批量的傳送訊息
sender的作用:歸類訊息為每個目標節點建立一個請求
sender執行緒並不真正傳送客戶端請求 sender執行緒會去遍歷記錄收集器中根據分割槽分好組的訊息batches,將相同目標節點[NodeId]的batches的訊息歸類,為相同目標節點的[NodeId]建立一個請求傳送訊息。
1.訊息放入記錄收集器時會按分割槽進行分組,存放到對應的batches,分割槽佇列儲存了即將傳送訊息的批記錄。
2.sender執行緒可以使用單執行緒迭代
消費者
-
什麼是管理者
管理者是消費者組中的概念,用於對同一個消費者組中的所有消費者進行協調。
-
什麼是reblance
簡單來說就是消費者消費訊息出現不均衡,會通過reblance達到動態平衡的過程。通常有如下幾個方面
- 消費者組訂閱的主題發生變化
- 消費者消費的分割槽數量出現變化
- 消費者組中的消費者數量發生變化
-
消費者什麼時候會再次加入消費者組
消費者只有在出現reblance的時候會出現再次加入消費者,分為如下步驟1.消費者準備好自身狀態2.和協調者傳送加入消費者組的請求3.成功加入消費者組,分配分割槽開始消費訊息。
-
說下2種消費模式
消費模式可分為訂閱模式和分配模式
- 訂閱模式 消費者訂閱指定主題,由協調者協調消費的分割槽
- 分配模式 由消費者指定消費的分割槽。此時協調者不參與
我們專案中有4個分割槽,使用的訂閱模式 設定了4個消費者。每個消費者獨立消費一個分割槽[由協調者安排]
-
ISR HW LEO 之間的關係
- ISR 正在主副本保持備份的副本
- HW high wather高水位 一般指的是ISR中同步主副本的進度最慢的副本當前正在同步的訊息的offset,在HW之前的訊息都可以被消費者拉取到
- LEO log end offset 當前主副本中正在寫入的訊息 一般是當前分割槽中最後一條訊息的offset+1
當主副本有訊息寫入的時候,follower會主動向leader獲取訊息,每次讀訊息都會更新HW當HW大於等於LEO時候可以認為是同步完成,副本管理者會想producer報告ack確認訊息儲存成功。
參考資料
- kafka實戰
- kafka技術內幕
- kafka在公司專案實踐