一、基礎概念類
問題:請簡述 Kafka 是什么,以及它的主要應用場景有哪些?
答案:Kafka 是一個分布式流處理平臺,它以高吞吐量、可持久化、可水平擴展等特性而聞名。其主要應用場景包括:
日志收集:可以收集和聚合來自不同來源的日志數據,方便進行集中存儲和分析。
消息隊列:作為異步消息傳遞系統,解耦生產者和消費者,提高系統的可擴展性和響應性能。
實時流處理:實時處理如金融交易數據、物聯網設備產生的數據等,進行實時分析和決策。
問題:Kafka 中的主題(Topic)、分區(Partition)和副本(Replica)分別是什么含義,它們之間有什么關系?
答案:
主題(Topic):是消息的邏輯分類,生產者發送消息到特定主題,消費者從主題中訂閱消息。
分區(Partition):每個主題可以被劃分為多個分區,分區是物理存儲單元,消息以追加的方式存儲在分區中。分區可以分布在不同的 Broker 上,實現并行處理和水平擴展。
副本(Replica):為了保證數據的可靠性,每個分區可以有多個副本。其中一個副本是領導者(Leader)副本,負責處理讀寫請求,其他副本是追隨者(Follower)副本,它們從領導者副本同步數據。當領導者副本出現故障時,追隨者副本中的一個會被選舉為新的領導者副本。
關系:一個主題包含一個或多個分區,每個分區有零個或多個副本。
生產者與消費者類
問題:Kafka 生產者如何保證消息的可靠性發送?
答案:
設置合適的 acks 參數:acks = 0 時,生產者發送消息后不等待任何確認,速度快但可能丟失消息;acks = 1 時,生產者等待領導者副本確認,若領導者副本確認前崩潰,消息可能丟失;acks = all 時,生產者等待所有同步副本確認,確保消息不會丟失,但性能相對較低。
重試機制:生產者發送消息失敗時,通過配置 retries 參數設置重試次數,避免因網絡等瞬時故障導致消息發送失敗。
冪等性:從 Kafka 0.11.0.0 版本開始,生產者支持冪等性,通過設置 enable.idempotence 為 true,保證即使在重試的情況下,相同消息也只會被成功寫入 Kafka 一次,避免重復消息。
問題:Kafka 消費者如何實現精準一次消費(Exactly Once)?
答案:
從生產者角度:利用生產者的冪等性和事務特性。生產者開啟冪等性(enable.idempotence = true),對于跨分區的事務,通過事務 API(如 initTransactions、beginTransaction、sendOffsetsToTransaction 等方法)確保一批消息要么全部成功寫入 Kafka,要么全部失敗。
從消費者角度:通過設置 enable.auto.commit = false,關閉自動提交消費偏移量。消費者在處理完消息后,手動提交偏移量,并且將偏移量提交操作包含在事務中,確保消息處理和偏移量提交的原子性。這樣當消費者重啟后,不會重復消費已經處理過的消息,從而實現精準一次消費。
集群與架構類
問題:Kafka 集群中 Zookeeper 的作用是什么?
答案:
集群管理:存儲 Kafka 集群的元數據信息,如主題、分區、Broker 等信息,幫助 Kafka 集群中的節點了解整個集群的狀態。
領導者選舉:在 Kafka 集群中,當某個分區的領導者副本出現故障時,Zookeeper 協助選舉出新的領導者副本。它通過臨時節點和 Watch 機制來監測 Broker 和分區的狀態變化,觸發選舉流程。
Broker 注冊:Kafka Broker 在啟動時會在 Zookeeper 中注冊自己,并且定期發送心跳信息保持連接,Zookeeper 根據這些信息來判斷 Broker 的存活狀態。
問題:Kafka 集群是如何實現水平擴展的?
答案:
添加 Broker:在已有的 Kafka 集群中,通過增加新的 Broker 節點來擴展集群的處理能力。新的 Broker 啟動后會向 Zookeeper 注冊自己,集群中的其他節點會感知到新節點的加入。
重新分配分區:使用 Kafka 提供的工具(如 kafka-reassign-partitions.sh),可以將現有主題的分區重新分配到新加入的 Broker 上。通過合理地分配分區,使得集群的負載更加均衡,提高整體的處理能力。例如,對于一個有大量讀寫操作的主題,可以將部分分區遷移到新的 Broker 上,減輕原有 Broker 的壓力。
生產者和消費者的自動感知:生產者和消費者在與 Kafka 集群交互時,能夠自動感知到集群的變化。當新的 Broker 加入或分區重新分配后,生產者可以將消息發送到新的分區,消費者也能從新的分區拉取消息,無需手動修改配置,從而實現無縫的水平擴展。