kafka面試總結

本文為複習期間面試總結

從以下方面對kafka面試進行總結:基本原理架構/項目實踐/生產者/消費者/協調者/存儲層/控制器

基本原理架構

  1. 簡單講下什麼是kafka[一句話概括/架構圖]

  2. 消息隊列選型 你們為什麼不選用其他消息隊列

  3. ZK 在消息隊列中的作用是什麼
    註冊中心[作為共享存儲保存了kafka集群和客戶端的相關信息]

  4. 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
  5. kafka有那些消息模型

    隊列模型和發佈訂閱 kafka使用消費者組統一了上面2種消息模型。[隊列1對1/訂閱1對多]

  6. kafka為什麼這麼快
    追加方式寫入 producer層選擇分區並行寫入數據[避免全量消息提交到協調階段在計算分區] 使用消息batch[消息批 減少通訊次數]

  7. kafka follower如何與leader同步數據

  8. kafka節點之間消息如何備份的

  9. kafka消息是否會丟失為什麼

  10. kafka的lead選舉機制是什麼

  11. kafka 的消息保障方式有那些

項目實踐

  1. ACK 0 -1 1分別代表什麼

    • [-1] 也就all 需要等待ISR中所有都同步完成
    • 1 默認的只需要等待主副本同步完成即可
    • 0 不確認就開始發送下一條消息
  2. 你們使用了kafka事務嗎

  3. 消息隊列丟失數據如何處理

    這個問題可以分為三個方面 生產者 消費者 消息隊列

    • 生產者方面我們使用的異步回調的方式,在收到回調的時候若消息沒有發送成功,我們會記錄再次發送。
    • 消費者 消費者的數據丟失可以認為是提交了offset但是數據處理失敗了,我們使用的手動提交在處理成功後在提交offset 不會遇到這個問題。但是要注意消息處理時間不能過長,如果處理過長還沒提交offset管理者可能會認為當前消費者下線從而觸發reblance
    • 消息隊列數據丟失 我們在kafka配置了ack = -1 要求所有ISR都確認同步了消息才給producer發送ack 所以可以保證消息不會丟失。

生產者

  1. 生產者消息發送的幾種方式
    同步阻塞 異步非阻塞 [都是通過send方法實現的]

  2. 生產者如何為消息選取分區的

    若消息沒有設置key loadblance寫入partition。如設置了key murmur2(key) mod PartitionNum

  3. 簡單講下生產者的工作流程

    1.主線程將消息封裝到ProducerRecord[partition/key/value/key/時間戳]
    2.client對ProducerRecord進行序列化
    3.根據分區策略確定分區[無key輪詢有key murmur2(key) mod PartitionNum]
    4.將消息放入緩存區[每一個分區對應一個雙端隊列,] 由sender線程將一個批次的消息batch的消息發送到對應的broker

  4. 生產者如何批量的發送消息

    sender的作用:歸類消息為每個目標節點建立一個請求

    sender線程並不真正發送客戶端請求 sender線程會去遍歷記錄收集器中根據分區分好組的消息batches,將相同目標節點[NodeId]的batches的消息歸類,為相同目標節點的[NodeId]創建一個請求發送消息。

    1.消息放入記錄收集器時會按分區進行分組,存放到對應的batches,分區隊列保存了即將發送消息的批記錄。

    2.sender線程可以使用單線程迭代

消費者

  1. 什麼是管理者

    管理者是消費者組中的概念,用於對同一個消費者組中的所有消費者進行協調。

  2. 什麼是reblance

    簡單來說就是消費者消費消息出現不均衡,會通過reblance達到動態平衡的過程。通常有如下幾個方面

    • 消費者組訂閱的主題發生變化
    • 消費者消費的分區數量出現變化
    • 消費者組中的消費者數量發生變化
  3. 消費者什麼時候會再次加入消費者組

    消費者只有在出現reblance的時候會出現再次加入消費者,分為如下步驟1.消費者準備好自身狀態2.和協調者發送加入消費者組的請求3.成功加入消費者組,分配分區開始消費消息。

  4. 說下2種消費模式

    消費模式可分為訂閱模式和分配模式

    • 訂閱模式 消費者訂閱指定主題,由協調者協調消費的分區
    • 分配模式 由消費者指定消費的分區。此時協調者不參與

    我們項目中有4個分區,使用的訂閱模式 設置了4個消費者。每個消費者獨立消費一個分區[由協調者安排]

  5. 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在公司項目實踐