【Kafka】常見簡單八股總結

為什么使用消息隊列?

  1. 解耦
    • 我以我的一段開發經驗舉例:

    【Kafka】登錄日志處理的三次階梯式優化實踐:從同步寫入到Kafka多分區批處理
    我做過一個登錄日志邏輯,就是在登錄邏輯末尾,加一段寫進數據庫登錄日志表的邏輯,那么,如果我們啥都不用,就單純同步寫入(就是在login函數返回之前加一段寫入邏輯),那么會拖慢login的操作,在高并發時,影響系統性能。

    • 如果我們把寫入邏輯異步實現,就可以形成,先讓用戶感知到登錄成功的效果,對登錄日志的寫入我們放到后臺執行,這樣的解耦形式。
    • 那就要用到消息隊列了,這時,簡單一點,我們可以利用go的channl,快速搭建一個簡易的消息隊列,但是你自己寫的很多功能是比不上kafka好使的,所以用kafka作為消息隊列,是更好的選擇。

Kafka 是基于主題(Topic)進行消息發布與訂閱的模型,實現生產者和消費者之間松散耦合

  1. 削峰填谷
    • 應對突發流量(如秒殺活動)時,消息隊列可暫存超出下游服務處理能力的請求,下游服務按自身節奏消費,避免因流量峰值直接壓垮系統。
  2. 異步處理
    • 非核心流程(如通知推送、數據統計)從主流程中剝離,通過消息隊列異步處理,減少主流程阻塞
  3. 容錯與持久化
    • 應對分布式系統中,某個上游節點/服務宕機時下游服務來不及處理其最后發出的數據,導致數據丟失的情況。
    • 如果有一個隊列做緩沖,那么他宕機前的所有發出數據,都可以暫存在這個隊列中,等候處理。
  4. 數據流處理與實時分析(萬流歸中)
    • 將多個服務產生的數據匯聚,方便實時分析
  5. 廣播與多訂閱模式
    • 一個生產者發布的消息需要被多個消費者處理,單純的點對點模式無法滿足,需要kafka的訂閱發布模式

    設置多個消費者組,每個消費者組中的一個消費者,可以分別處理一次消息

解耦、削峰填谷、異步處理、容錯與持久化、數據流處理與實時分析、廣播與多訂閱模式


Kafka 架構原理

1. Broker

  • Broker 是 Kafka 的服務器實例,負責接收、存儲和傳輸消息。Kafka 集群由一個或多個 Broker 組成,通常每個 Broker 是一個獨立的物理或虛擬服務器。
  • 每個 Broker 都可以存儲多個 Topic 的數據,并為這些數據提供讀取服務。Kafka 的分布式特性允許將數據分布在不同的 Broker 上,以實現水平擴展。

2. Producer(生產者)

  • Producer 是消息的發送者,負責將數據發布到 Kafka 中的 Topic
  • Producer 可以指定消息發送到某個 Partition,也可以通過輪詢或基于特定規則(如基于鍵的哈希值)來選擇 Partition。

3. Consumer(消費者)

  • Consumer 是消息的讀取者,負責從 Kafka 的 Topic 中訂閱并讀取消息。
  • Consumer 組的概念允許多個 Consumer 實例組成一個組,來平衡消費不同 Partition 的消息。

4. Topic 和 Partition

  • Topic 是 Kafka 中消息的分類單位,類似于數據庫中的表。每個 Topic 可以有多個 Partition,而 Partition 是 Kafka 的并行處理單位。
  • 每個 Partition 是一個有序的、不可變的日志文件,每條消息在 Partition 中都有一個唯一的偏移量(offset)。Partition 保證了順序性,而不同 Partition 之間可以并行處理。

5. Zookeeper / Raft(控制器)

  • Kafka 使用 Zookeeper 來管理集群元數據、協調 Broker 和維護 Partition 的 Leader 選舉過程。
  • 新的 Kafka 版本可以使用 KRaft 協議來替代 Zookeeper,用于集群控制和選舉 Leader。

關于Raft協議
是一種針對主節點宕機時,從節點如何快速選舉出新主節點的分布式一致性協議。

核心解決3個問題:

  1. 從節點如何快速感知主節點宕機?
  • 主節點會定期廣播心跳,從節點接收后重置自身內置計數器。
  • 若計數器歸零前未收到心跳,從節點即判定主節點宕機。
  1. 如何選舉新主節點?
  • 感知宕機的從節點切換為候選者,向所有節點廣播"請求投票"
  • 其他節點收到后進行投票,獲得大多數節點支持的候選者成為新主節點。
  1. 為什么從節點計數器要設為隨機值,而非統一短時間?
  • 若計數器統一,所有從節點會同時感知宕機并爭當候選者,導致投票分散,需多次重試,降低效率。
  • 隨機計數器可讓部分節點更早發起選舉,優先獲得多數票,實現快速選主。

補充

  • 任期(Term):每個選舉周期的唯一標識(遞增整數),確保每次選舉在新任期內進行,避免舊投票干擾。
  • 投票原則一任期內僅投一票,且優先給日志更新的候選者投票(保證數據一致性)。

6. Leader 和 Follower

Kafka 通過 Partition 副本機制保證數據的高可用性

副本機制:每個 partition 有多份 replica,分為 Leader 和 Follower

(且副本的數量不能大于Broker的數量followerleader絕對是在不同的機器同一機器對同一個分區也只可能存放一個副本(包括自己)。)

  • 每個 Partition 都有一個 Leader,負責處理所有的讀寫請求。其他副本稱為 Follower,它們從 Leader 同步數據。

圍繞leader和follower,可以引出三種ACK機制,在配置partition時,分別決定了不同級別的消息可靠性

  1. acks=0:Producer 只管發 不管 Broker 是否收到 → 可能丟
  2. acks=1:Producer 發消息,Leader 收到即確認收到 → Leader 崩了可能丟
  3. acks=all:Producer 發消息,Leader 和 Follower 都收到消息,Leader 確認消息發送成功 → Broker 崩了可能丟
  • 當 Leader 宕機時,Kafka 會自動從 Follower 中選舉新的 Leader,以保證高可用性。

Kafka 的分區 Leader 選舉機制不使用 Raft 協議,在kafka 2.8之前是依賴 ZooKeeper 進行協調kafka 2.8之后即 Kafka Raft 協議
Raft協議 適用于單個集群的一致性管理,而 KRaft 是針對 Kafka 分區副本的分布式場景優化支持多分區并行選舉


進一步梳理:

一、再次理解核心概念的正確關系

  1. Topic(主題)

    • Topic 是 Kafka 中消息的邏輯分類,類似于一個消息隊列的名稱。例如,電商系統中可能有“訂單消息”“支付消息”等多個 Topic,分別存儲不同類型的消息。
    • Topic 本身并不直接存儲消息,而是通過“分區(Partition)”來分布式存儲消息。
  2. Partition(分區)

    • 每個 Topic 可以被劃分為多個 Partition(數量可配置),消息會被分散存儲在這些 Partition 中。
    • Partition 是 Kafka 實現高吞吐量分布式存儲的核心:
    • 多個 Partition 可以分布在不同的 Broker 上(一個 Broker 可以存放多個 Partition),實現負載均衡。
    • 消息在 Partition 中是有序存儲的(按寫入順序形成日志),但不同 Partition 之間的消息無序。
  3. Broker(服務器節點)

    • Broker 是 Kafka 集群中的單個服務器節點,負責存儲消息、處理生產者和消費者的請求。
    • 一個 Kafka 集群由多個 Broker 組成,Broker 之間通過 ZooKeeper 協調管理(如集群元數據、分區副本分配等)。
    • Broker 存儲的是 Partition,而不是直接存儲 Topic:一個 Topic 的多個 Partition 可以分布在多個 Broker 上,單個 Broker 也可以存放多個不同 Topic 的 Partition。

二、生產者與消費者的工作流程

  1. 生產者(Producer)

    • 生產者向指定的 Topic 發送消息,Kafka 會根據一定的規則(如哈希、輪詢或自定義策略)將消息分配到該 Topic 的某個 Partition 中。
    • 消息一旦寫入 Partition,就會被持久化(默認存盤),并生成一個唯一的偏移量(Offset)標識其在 Partition 中的位置。

    從這里可以引出kafka的高效持久化核心機制:
    0. Kafka 的 Partition 本質上是一個日志文件(Log),消息被寫入時采用 “追加寫入” 的方式(即只能在文件末尾順序添加,不允許隨機修改或刪除

    1. kafka是存在磁盤的,向指定topic發消息,然后寫入partition,(在磁盤上是順序寫入的,眾所周知,在機械硬盤上,順序寫入速度可以媲美內存,固態更不用說了)將磁盤的性能發揮到了極致
    2. 由于消息只能追加在上一條消息末尾,為了適應磁盤順序寫入,引入偏移量機制,無需維護復雜的索引結構(僅通過 Offset 定位)減少了元數據開銷,進一步提升寫入性能
    3. 消費者通過記錄 Offset,知道下次從哪個位置開始消費(例如,消費完 Offset=5 的消息后,下次從 Offset=6 開始)。
    4. 因此 Partition 內的消息通過 Offset 天然保持有序(這也是 Kafka 能保證 “分區內消息有序” 的核心)。
    5. Offset 僅在單個 Partition 內有效,不同 Partition 的 Offset 相互獨立
  2. 消費者(Consumer)與消費者組(Consumer Group)

    • 消費者從 Topic 中讀取消息,必須指定消費的 Partition(由 Kafka 自動分配或手動指定)。
    • 消費者組是多個消費者的集合,同一個消費者組內的消費者共同消費一個 Topic 的所有 Partition,且一個 Partition 只能被同一個消費者組內的一個消費者消費(避免重復消費)。
    • 不同消費者組可以獨立消費同一個 Topic(彼此互不影響),例如“訂單消息”Topic 可以被“物流系統”和“數據分析系統”兩個消費者組分別消費。

三、總結關系圖(簡化)

Kafka 集群
├─ Broker 1
│  ├─ Topic A 的 Partition 0
│  └─ Topic B 的 Partition 1
├─ Broker 2
│  ├─ Topic A 的 Partition 1
│  └─ Topic C 的 Partition 0
└─ Broker 3└─ Topic B 的 Partition 0
  • Topic A 包含 2 個 Partition,分別在 Broker 1 和 Broker 2 上。
  • 每個 Broker 存放了不同 Topic 的 Partition。

kafka的存儲機制

  1. 消息持久化

    • Kafka 的存儲機制主要圍繞 存在磁盤上的日志(Log) 文件來實現數據的高效存儲和讀取。每個 Partition 被存儲為一個 日志文件,消息按照追加寫(順序)的方式存儲到日志中

    通過 offest 順序寫入,順序讀取

  2. Segment分段存儲

    • 每個 Partition 日志文件會進一步被分為多個 Segment。Segment 是物理上日志文件的一部分,當一個 Segment 達到預定大小或時間限制時,Kafka 會關閉這個 Segment 并開始寫入下一個 Segment

    分段存儲的方式使得 Kafka 在刪除舊消息時不需要修改文件,只需要刪除老的 Segment 文件即可

  3. 消息保留策略

    • 基于時間保留:可以配置 Kafka 將 Partition中,超過設定時間的Segment刪除,例如保留 7 天的數據。
    • 基于大小保留:可以根據每個 Partition 日志文件的大小來設置消息保留,超過設定大小后,刪除最早的 Segment
  4. 日志壓縮

    • 永久保留最新版本的每個消息鍵。對于相同鍵的消息,Kafka 只保留最新的,刪除舊的。
  5. 零拷貝

    • Kafka 在內存和網絡之間的傳輸不經過 CPU 的數據拷貝。減少了 CPU 和內存的開銷,極大提高了數據傳輸效率

    生產者發送消息Broker 轉發消息以及消費者消費消息時都能發揮作用


Kafka的消費者策略

  1. 單獨消費者模式
    • 單個消費者獨占訂閱的Topic分區,其他消費者無法同時消費這些分區。
  2. 消費者組模式
    • 多個消費者組成一個組,共同消費同一Topic,每個分區僅被組內一個消費者處理
    • 不同消費組可獨立消費同一Topic,互不干擾。
    • 通過動態增減消費者實例靈活擴展處理能力,提升效率。

一、Kafka 確保一致性的核心機制

  1. 副本同步機制:每個分區的 Follower 副本實時從 Leader 副本同步數據,保證副本間數據一致。
  2. ISR 列表管理:僅維護與 Leader 數據同步的副本(In-Sync Replicas),非 ISR 副本不參與數據確認,避免數據不一致。
  3. Leader 唯一寫入:所有讀寫操作由 Leader 副本處理,Follower 僅同步數據,確保同一分區的數據操作入口唯一。
  4. 選舉規則約束:Leader 宕機時,僅從 ISR 中選舉新 Leader,保證新 Leader 擁有最新數據,避免數據回退。

二、Kafka 確保可靠性的核心機制

  1. 持久化存儲:消息按順序寫入磁盤并生成 Offset,即使 Broker 宕機,數據也不會丟失。
  2. 生產者確認機制:通過 acks 參數控制消息確認級別(如 acks=-1 要求 ISR 中多數副本確認),確保消息被安全存儲。
  3. 副本冗余:多副本機制實現數據冗余,單個副本故障時,其他副本可繼續提供服務。
  4. 消費者 Offset 管理:消費者通過提交 Offset 記錄消費進度,支持手動提交,避免重復消費或數據丟失。
  5. 故障自動恢復:Leader 故障后自動從 ISR 選舉新 Leader,Broker 故障恢復后可重新加入集群同步數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94051.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序連接到阿里云物聯網平臺

目錄準備階段阿里云配置下載mqtt.min.js文件小程序實現注意小程序配置服務器域名概述:介紹使用微信小程序連接到阿里云平臺的快捷方法和完整過程。 阿里云平臺建立設備,提供mqtt連接參數,小程序借助mqtt.min.js,也就是基于Github下…

2-3〔O?S?C?P? ? 研記〕? 漏洞掃描?AppScan(WEB掃描)

鄭重聲明: 本文所有安全知識與技術,僅用于探討、研究及學習,嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任,本人不承擔任何責任。 如需轉載,請注明出處且不得用于商業盈利。 …

LeetCode 刷題【47. 全排列 II】

47. 全排列 II 自己做 解1&#xff1a;檢查重復 class Solution { public:void circle(vector<int> nums, vector<vector<int>> &res,int start){int len nums.size();if(start len - 1){ //到頭了//檢查重復bool is_exist fa…

Https之(一)TLS介紹及握手過程詳解

文章目錄簡介 TLSTLS第一次握手1.Client HelloTLS第二次握手2.Server Hello3.Certificate4.Server Hello DoneTLS第三次握手5.Client Key Exchange6.Change Cipher Spec7.Encrypted Handshake MessageTLS第四次握手8.New Session Ticket9.Change Cipher Spec10.Encrypted Hands…

【WEB 】從零實現一個交互輪播圖(附源碼)

文章目錄 一、輪播圖整體功能規劃二、HTML結構深度解析三、CSS樣式實現細節1. 定位系統詳解2. 顯示/隱藏機制3. 按鈕交互效果實現4. 純CSS箭頭實現5. 指示器&#xff1a;當前位置可視化 四、JavaScript邏輯深入解析1. 核心變量與DOM獲取2. 圖片切換函數&#xff08;核心邏輯&am…

機器學習--PCA降維

一核心部分 1解決的問題&#xff1a;應對高維數據帶來的計算量大、冗余信息多、易出現過擬合等問題&#xff0c;在減少數據維度的同時盡可能保留原始數據的關鍵信息。2核心思想&#xff1a…

leetcode 1277. 統計全為 1 的正方形子矩陣 中等

給你一個 m * n 的矩陣&#xff0c;矩陣中的元素不是 0 就是 1&#xff0c;請你統計并返回其中完全由 1 組成的 正方形 子矩陣的個數。示例 1&#xff1a;輸入&#xff1a;matrix [[0,1,1,1],[1,1,1,1],[0,1,1,1] ] 輸出&#xff1a;15 解釋&#xff1a; 邊長為 1 的正方形有…

知識蒸餾 - 各類概率分布

知識蒸餾 - 各類概率分布 flyfish一、離散概率分布 離散分布描述的是取值為離散值&#xff08;如0,1,2,…&#xff09;的隨機變量的概率規律&#xff0c;通常用概率質量函數&#xff08;PMF&#xff09; 表示某一取值的概率。 1. 伯努利分布&#xff08;Bernoulli Distribution…

軟件測試-Selenium學習筆記

""" 目標&#xff1a; driver.find_element() 需求&#xff1a; 1. 使用driver.find_element()方法 2. 輸入用戶名&#xff1a;admin 3. 輸入密碼&#xff1a;123456 """ # 導包 from selenium import webdriver from time import …

知微傳感3D相機上位機DkamViewer使用:給相機升級固件

寫在前面 本人從事機器視覺細分的3D相機行業。編寫此系列文章主要目的有&#xff1a; 1、便利他人應用相機&#xff0c;本系列文章包含公司所出售相機的SDK的使用例程及詳細注釋&#xff1b;2、促進行業發展及交流。 知微傳感Dkam系列3D相機可以應用于定位分揀、焊接焊縫提取、…

CMake進階: CMake Modules---簡化CMake配置的利器

目錄 1.簡介 2.為什么需要 CMake Modules&#xff1f; 3.內置模塊&#xff1a;開箱即用的工具 3.1.依賴查找模塊&#xff08;FindXXX.cmake&#xff09; 3.2.功能檢測模塊&#xff08;CheckXXX.cmake&#xff09; 3.3.通用工具模塊&#xff08;如 FetchContent.cmake、CT…

【Docker】Ubuntu上安裝Docker(網絡版)

【Docker】Ubuntu上安裝Docker注意&#xff1a;一、環境準備1. 系統要求2. 卸載舊版本二、安裝步驟1.配置倉庫源2.安裝 Docker引擎3.驗證安裝情況三、解決報錯1、檢查網絡連接2、檢查Docker服務狀態3、換源4.重載生效、重啟服務、查看是否配置成功5.驗證解決情況四、權限與配置…

Socket 編程 TCP

TCP 網絡程序 和剛才 UDP 類似. 實現一個簡單的英譯漢的功能。TCP是面向字節流的可靠傳輸&#xff0c;如同前文的管道流&#xff0c;只要是流&#xff0c;它的操作就是文件的寫出與讀入。TCP socket API 詳解下面介紹程序中用到的 socket API,這些函數都在 sys/socket.h 中。so…

使用AWS S3 + Lambda + MediaConvert 實現上傳視頻文件并自動轉碼

前言 最近團隊在做短視頻平臺的技術調研&#xff0c;其中有一個環節便是音視頻開發&#xff0c;即對用戶上傳的視頻進行自適應轉碼。自適應的原理其實就是預先將視頻轉換為幾個常用的分辨率&#xff0c;app端根據用戶手機分辨率拉取相應分辨率的視頻。 目前嘗試了兩種方案&…

QT之QWaitCondition降低cpu占用率,從忙等待到高效同步

在多線程編程中&#xff0c;線程間的同步是一個核心問題。在處理線程等待時&#xff0c;經常會寫出高CPU占用率的代碼&#xff0c;其中最典型的就是使用忙等待&#xff08;busy waiting&#xff09;。本文將詳細介紹如何使用Qt框架中的QWaitCondition類來優雅地解決這一問題&am…

pcl求平面點云的邊界凸包點

基本流程1&#xff0c;讀入點云&#xff0c;并去除無效點2&#xff0c;擬合平面3&#xff0c;去除離平面距離較遠的點4&#xff0c;對點云進行平面投影5&#xff0c;進行convex_hull運算初學者&#xff0c;暫時不知道能用來干嘛。練手還是非常不錯的&#xff01;#define _CRT_S…

Windows系統上使用GIT

首先破除一下畏懼心理&#xff1a;在Windows上使用git和在linux系統中的使用方法是一樣的&#xff0c;只是安裝方式沒那么便捷&#xff0c;畢竟linux中安裝git只需要一行命令 GIT下載地址 如果你的電腦的CPU是64位的&#xff0c;就點擊&#xff1a; Git-2.50.1-64-bit.exe 如果…

《設計模式之禪》筆記摘錄 - 17.模板方法模式

模板方法模式的定義模板方法模式(Template Method Pattern)是如此簡單&#xff0c;以致讓你感覺你已經能夠掌握其精髓了。其定義如下&#xff1a;Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.Template Method lets subclasses r…

SpreadJS 協同服務器 MongoDB 數據庫適配支持

為了支持 SpreadJS 協同編輯場景&#xff0c;協同服務器需要持久化存儲文檔、操作、快照及里程碑數據。本文介紹了 MongoDB 數據庫適配器的實現方法&#xff0c;包括集合初始化、適配器接口實現以及里程碑存儲支持。 一、MongoDB 集合初始化 協同編輯服務需要以下集合&#x…

Ubuntu 主機名:精通配置與管理

主機名&#xff08;hostname&#xff09;是Linux系統中用于標識網絡上特定設備的名稱&#xff0c;它在網絡通信、服務配置&#xff08;如 Kubernetes 集群、數據庫&#xff09;以及日志記錄中扮演著至關重要的角色。對于初學者來說&#xff0c;配置主機名似乎很簡單&#xff0c…