Kafka基礎理論

Kafka概述

kafka是一個分布式的基于發布/訂閱模式的消息隊列,主要用于大數據實時處理領域。kafka采取了發布/訂閱模式,消息的發布者不會將消息直接發送給特定的訂閱者,而是將發布的消息分為不同的類別,訂閱者只接受感興趣的消息。

消息隊列

  1. 傳統的消息隊列的主要應用場景包括:緩存/削峰、解耦和異步通信。

    • 緩沖/削峰:有助于控制和優化數據流經過系統的速度,解決生產消息和消費消息的處理速度不一致的情況。
      在這里插入圖片描述

    • 解耦:允許獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。
      在這里插入圖片描述

    • 異步通信:允許用戶把一個消息放入隊列,但并不立即處理它,然后在需要的時候再去處理它們。
      在這里插入圖片描述

  2. 消息隊列的兩種模式

    • 點對點模式:消費者主動拉取數據,消息收到后清除mq里的消息
    • 發布/訂閱模式:可以有多個topic主題;消費者消費數據之后,不刪除數據;每個消費者相互獨立,都可以消費到數據。

Kafka基礎架構

  1. Producer:消息生產者,就是向 Kafka broker 發消息的客戶端。
  2. Consumer:消息消費者,向 Kafka broker 取消息的客戶端。
  3. Consumer Group(CG):消費者組,由多個 consumer 組成。消費者組內每個消費者負責消費不同分區的數據,一個分區只能由一個組內消費者消費;消費者組之間互不影響。所有的消費者都屬于某個消費者組,即消費者組是邏輯上的一個訂閱者。
  4. Broker:一臺 Kafka 服務器就是一個 broker。一個集群由多個 broker 組成。一個broker 可以容納多個 topic。
  5. Topic:可以理解為一個隊列,生產者和消費者面向的都是一個 topic。
  6. Partition:為了實現擴展性,一個非常大的 topic 可以分布到多個 broker(即服務器)上,一個 topic 可以分為多個partition,每個 partition 是一個有序的隊列。
  7. Replica:副本。一個 topic 的每個分區都有若干個副本,一個 Leader 和若干個Follower。
  8. Leader:每個分區多個副本的“主”,生產者發送數據的對象,以及消費者消費數據的對象都是 Leader。
  9. Follower:每個分區多個副本中的“從”,實時從 Leader 中同步數據,保持和Leader 數據的同步。Leader 發生故障時,某個 Follower 會成為新的 Leader。
  10. zk中記錄誰是leader,kafka2.8之后也可以不配置zk。

在這里插入圖片描述

Kafka的安裝部署

筆者是采用k8s的方式在云服務器上部署kafka的,具體的安裝步驟,大家可以參考這篇博客:https://blog.csdn.net/weixin_46619605/article/details/146170695,這里就不再敘述。

Kafka的命令行操作

主題命令行操作

  1. 查看操作主題命令參數

      bin/kafka-topics.sh
    
  2. 查看當前服務器中的所有topic

    bin/kafka-topics.sh --bootstrap-server xx:xx --list
    

    在這里插入圖片描述

生產者命令行操作

  1. 查看操作生產者命令參數
    bin/kafka-console-producer.sh
    
    在這里插入圖片描述

消費者命令行操作

  1. 查看操作消費者命令參數

    bin/kafka-console-consumer.sh
    

    在這里插入圖片描述
    在這里插入圖片描述

生產者消息發送流程

  • 發送原理
    在消息發送的過程中,涉及到了兩個線程——main 線程和 Sender 線程。在 main 線程中創建了一個雙端隊列 RecordAccumulator。main 線程將消息發送給RecordAccumulator,Sender 線程不斷從 RecordAccumulator 中拉取消息發送到 Kafka Broker。

在這里插入圖片描述

  • 生產者分區
    1. 便于合理使用存儲資源,每個Partition在一個Broker上存儲,可以把海量的數據按照分區切割成一塊一塊數據存儲在多臺Broker上。合理控制分區的任務,可以實現負載均衡的效果。
    2. 提高并行度,生產者可以以分區為單位發送數據;消費者可以以分區為單位進行消費數據。

Kafka Broker總體工作流程

在這里插入圖片描述

Kafka副本

  1. Kafka 副本作用:提高數據可靠性。
  2. Kafka 默認副本 1 個,生產環境一般配置為 2 個,保證數據可靠性;太多副本會增加磁盤存儲空間,增加網絡上數據傳輸,降低效率。
  3. Kafka 中副本分為:Leader 和 Follower。Kafka 生產者只會把數據發往 Leader,然后 Follower 找 Leader 進行同步數據。
  4. Kafka 分區中的所有副本統稱為 AR(Assigned Repllicas)。
    AR = ISR + OSR
    ISR,表示和 Leader 保持同步的 Follower 集合。如果 Follower 長時間未向 Leader 發送通信請求或同步數據,則該 Follower 將被踢出 ISR。該時間閾值由 replica.lag.time.max.ms參數設定,默認 30s。Leader 發生故障之后,就會從 ISR 中選舉新的 Leader。
    OSR,表示 Follower 與 Leader 副本同步時,延遲過多的副本。

在這里插入圖片描述
在這里插入圖片描述

文件存儲機制

在這里插入圖片描述

文件清理策略

Kafka 中默認的日志保存時間為 7 天,可以通過調整如下參數修改保存時間。

  • log.retention.hours,最低優先級小時,默認 7 天。
  • log.retention.minutes,分鐘。
  • log.retention.ms,最高優先級毫秒。
  • log.retention.check.interval.ms,負責設置檢查周期,默認 5 分鐘。

Kafka中提供的日志清理策略有delete和compact。

  • delete日志刪除:將過期數據刪除
    log.cleanup.policy = delete 所有數據啟用刪除策略
    1. 基于時間:默認打開。以 segment 中所有記錄中的最大時間戳作為該文件時間戳。
    2. 基于大小:默認關閉。超過設置的所有日志總大小,刪除最早的 segment。
      log.retention.bytes,默認等于-1,表示無窮大。
  • compact日志壓縮:對于相同的key的不同value值,只保留最后一個版本。

高效讀寫數據

  1. Kafka 本身是分布式集群,可以采用分區技術,并行度高
  2. 讀數據采用稀疏索引,可以快速定位要消費的數據
  3. 順序寫磁盤
    Kafka 的 producer 生產數據,要寫入到 log 文件中,寫的過程是一直追加到文件末端,為順序寫。官網有數據表明,同樣的磁盤,順序寫能到 600M/s,而隨機寫只有 100K/s。這與磁盤的機械機構有關,順序寫之所以快,是因為其省去了大量磁頭尋址的時間。
  4. 頁緩存+零拷貝技術
    PageCache頁緩存:Kafka重度依賴底層操作系統提供的PageCache功 能。當上層有寫操作時,操作系統只是將數據寫入PageCache。當讀操作發生時,先從PageCache中查找,如果找不到,再去磁盤中讀取。實際上PageCache是把盡可能多的空閑內存都當做了磁盤緩存來使用。
    零拷貝:Kafka的數據加工處理操作交由Kafka生產者和Kafka消費者處理。Kafka Broker應用層不關心存儲的數據,所以就不用走應用層,傳輸效率高。

Kafka消費方式

  • pull模式:consumer采用從broker中主動拉取數據。kafka采用這種方式。不足之處,如果kafka沒有數據,消費者可能會陷入循環中,一直返回空數據。
  • push模式:Kafka沒有采用這種方式,因為由broker決定消息發送速率,很難適應所有消費者的消費速率。

Kafka消費者工作流程

在這里插入圖片描述

消費者組原理

Consumer Group(CG):消費者組,由多個consumer組成。形成一個消費者組的條件,是所有消費者的groupid相同。

  • 消費者組內每個消費者負責消費不同分區的數據,一個分區只能由一個組內消費者消費。
  • 消費者組之間互不影響。所有的消費者都屬于某個消費者組,即消費者組是邏輯上的一個訂閱者。
  • 如果向消費組中添加更多的消費者,超過主題分區數量,則有一部分消費者就會閑置,不會接收任何消息。
    在這里插入圖片描述

消費者組初始化流程

在這里插入圖片描述

消費者詳細消費流程

在這里插入圖片描述

消費offset 位移

__consumer_offsets 主題里面采用 key 和 value 的方式存儲數據。key 是 group.id+topic+分區號,value 就是當前 offset 的值。每隔一段時間,kafka 內部會對這個 topic 進行compact,也就是每個 group.id+topic+分區號就保留最新數據。

  1. 為了使我們能夠專注于自己的業務邏輯,Kafka提供了自動提交offset的功能。
    自動提交offset的相關參數:

    • enable.auto.commit:是否開啟自動提交offset功能,默認是true
    • auto.commit.interval.ms:自動提交offset的時間間隔,默認是5s
  2. 雖然自動提交offset十分簡單便利,但由于其是基于時間提交的,開發人員難以把握offset提交的時機。因此Kafka還提供了手動提交offset的API。手動提交offset的方法有兩種:分別是commitSync(同步提交)和commitAsync(異步提交)。兩者的相同點是,都會將本次提交的一批數據最高的偏移量提交;不同點是,同步提交阻塞當前線程,一直到提交成功,并且會自動失敗重試(由不可控因素導致,也會出現提交失敗);而異步提交則沒有失敗重試機制,故有可能提交失敗。

    • commitSync(同步提交):必須等待offset提交完畢,再去消費下一批數據。
    • commitAsync(異步提交) :發送完提交offset請求后,就開始消費下一批數據了。

指定Offset消費

auto.offset.reset = earliest | latest | none 默認是 latest。
當 Kafka 中沒有初始偏移量(消費者組第一次消費)或服務器上不再存在當前偏移量時(例如該數據已被刪除),該怎么辦?

  1. earliest:自動將偏移量重置為最早的偏移量,–from-beginning。
  2. latest(默認值):自動將偏移量重置為最新偏移量。
  3. none:如果未找到消費者組的先前偏移量,則向消費者拋出異常。
  4. 任意指定 offset 位移開始消費。

漏消費和重復消費

重復消費:已經消費了數據,但是 offset 沒提交。
漏消費:先提交 offset 后消費,有可能會造成數據的漏消費。
在這里插入圖片描述

消費者事務

在這里插入圖片描述

數據積壓(消費者如何提高吞吐量)

在這里插入圖片描述

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

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

相關文章

蒼穹外賣項目實戰(day-5完整版)-記錄實戰教程及問題的解決方法

Redis基本操作及下載安裝包(Redis及可視化工具),都在我的上一篇文章:Redis基本知識及簡單操作,這里不再贅述 店鋪營業狀態修改功能 (1)需求分析與設計 (2)SpringDataRe…

第R8周:RNN實現阿爾茲海默病診斷

數據集包含2149名患者的廣泛健康信息,每名緩則的ID范圍從4751到6900不等,該數據集包含人口統計詳細信息,生活方式因素、病史、臨床測量、認知和功能評估、癥狀以及阿爾茲海默癥的診斷。 一、準備工作 1、硬件準備 import numpy as np import …

MySQL復制技術的發展歷程

在互聯網應用不斷發展的二十多年里,MySQL 一直是最廣泛使用的開源關系型數據庫之一。它憑借開源、輕量、靈活的優勢,支撐了無數網站、移動應用和企業系統。支撐 MySQL 長期發展的關鍵之一,就是 復制(Replication)技術。…

C++從字符串中移除前導零

該程序用于去除字符串開頭的零字符。當輸入"0000123456"時,程序會輸出"123456"。核心函數removeZero()通過while循環找到第一個非零字符的位置,然后使用erase()方法刪除前面的所有零。主函數讀取輸入字符串并調用該函數處理。程序簡…

【面試題】C++系列(一)

本專欄文章持續更新,新增內容使用藍色表示。C面向對象的三大特性:封裝,繼承,多態(1)封裝是將數據和函數組合到一個類里。主要目的是隱藏內部的實現細節,僅暴露必要的接口給外部。通過封裝&#…

當沒辦法實現從win復制東西到Linux虛擬機時的解決辦法

① 先確認是否已安裝bash復制sudo apt list --installed | grep open-vm-tools如果 沒有任何回顯 → 沒裝,跳到 ③如果看到 open-vm-tools 已安裝 → 繼續 ②② 啟動正確的服務(單詞別打錯)bash復制systemctl status vmtoolsd # 查看…

用Markdown寫自動化用例:Gauge實戰全攻略!

你作為一名自動化測試工程師,正在為一個復雜的Web應用編寫測試腳本:傳統工具要求寫大量代碼,維護起來像解謎游戲,團隊非技術成員完全插不上手。這時,Gauge這個“自動化神器”如魔法般出現——它允許用Markdown寫可讀的…

Unity開發保姆級教程:C#腳本+物理系統+UI交互,3大模塊帶你通關游戲開發

文章目錄基礎概念Unity開發環境搭建版本選擇:為什么2021 LTS是最佳起點?三步安裝:從下載到項目創建界面認知:5分鐘掌握核心操作區配置優化:讓開發更順暢驗證環境:創建你的第一個CubeC#基礎語法與Unity腳本結…

Depth Anything V2論文速讀

這篇論文主要講了兩方面1.為了解決模型在正常標注的現實圖像上訓練的缺陷問題、提出了新的模型訓練數據和訓練方法真實標記圖像存在缺點:標簽噪聲(深度傳感器可能存在空洞、玻璃等物體反射導致精度不準確)、標簽細節粗糙(深度圖邊…

數據庫原理及應用_數據庫管理和保護_第5章數據庫的安全性_理論部分

前言 "<數據庫原理及應用>(MySQL版)".以下稱為"本書"中第5章前6節內容 引入 數據庫的安全性是非常重要的,表現在兩個方面:一數據的訪問權限,二數據的物理安全.本書在這一章前6節基本上都是理論性的內容,選擇其中重要部分進行解讀. 5.1數據庫安全性…

QT6 配置 Copilot插件

下載項目&#xff1a;解壓 GitHub - github/copilot.vim: Neovim plugin for GitHub Copilot Node.js必須安裝 Node.js — Download Node.js 例如先安裝一個qt6 ,qt Cteatror選擇新版本的 設置 效果&#xff0c;注釋里面寫要求&#xff0c;tab同意 #include "mainwindow…

ArcGIS學習-15 實戰-建設用地適宜性評價

選定參評因子 高程坡度河流道路土地利用 確定因子分析標準 以下僅參數僅做展示&#xff0c;并非合理的數值 高程 0-100m&#xff1a;100 分&#xff0c;此高程范圍通常地勢較為平坦&#xff0c;建設成本相對較低&#xff0c;適宜建設。100-200m&#xff1a;70 分&#xff…

[C/C++學習] 7.“旋轉蛇“視覺圖形生成

參考文獻: 童晶. C和C游戲趣味編程[M].人民郵電出版社.2021. 一.弧度制和角度制的轉換 弧度制數值和角度對應表: (PI為圓周率&#xff0c;值為3.1415926)弧度制角度制00PI/630PI/360PI/2902*PI/3120PI1802*PI360二.扇形的繪制 easyx的solidpie( )函數用于在一個矩形區域內繪制…

自然語言處理之PyTorch實現詞袋CBOW模型

在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;詞向量&#xff08;Word Embedding&#xff09;是將文本轉換為數值向量的核心技術。它能讓計算機“理解”詞語的語義關聯&#xff0c;例如“國王”和“女王”的向量差可能與“男人”和“女人”的向量差相似。而Word2…

TCP, 三次握手, 四次揮手, 滑動窗口, 快速重傳, 擁塞控制, 半連接隊列, RST, SYN, ACK

目錄 TCP 是什么&#xff1a;面向連接 可靠 字節流三次握手&#xff1a;為什么不是兩次四次揮手與 TIME_WAIT&#xff1a;誰等誰序列號/確認號與去重、排序、確認重傳機制&#xff1a;超時重傳與快速重傳滑動窗口與流量控制擁塞控制&#xff1a;慢啟動/擁塞避免/快重傳/快恢…

CentOS 7.2 虛機 ssh 登錄報錯在重啟后無法進入系統

文章目錄前言1. 故障描述2. 故障診斷3. 故障原因4. 解決方案總結前言 上周幫用戶處理了一個 linux 虛擬機在重啟后無法正常進入操作系統的故障&#xff0c;覺得比較有意思&#xff0c;在這里分享給大家。 1. 故障描述 事情的起因是一臺系統版本為 CentOS 7.2 的 VMware 虛擬機…

《從使用到源碼:OkHttp3責任鏈模式剖析》

一 從使用開始0.依賴引入implementation ("com.squareup.okhttp3:okhttp:3.14.7")1.創建OkHttpClient實例方式一&#xff1a;直接使用默認配置的Builder//從源碼可以看出&#xff0c;當我們直接new創建OkHttpClient實例時&#xff0c;會默認給我們配置好一個Builder …

安裝3DS MAX 2026后,無法運行,提示缺少.net core的解決方案

今天安裝了3DS MAX 2026&#xff08;俗稱3DMAX&#xff09;&#xff0c;安裝完畢后死活運行不了。提示如下&#xff1a; 大意是找不到所需的.NET Core 8庫文件。后來搜索了下&#xff0c;各種文章說.NET CORE和.NET FRAMEWORK不是一個東西。需要單獨下載安裝。然后根據提示&…

FastAPI + LangChain 和 Spring AI + LangChain4j

FastAPI+LangChain和Spring AI+LangChain4j這兩個技術組合進行詳細對比。 核心區別: 特性維度 FastAPI + LangChain (Python棧) Spring AI + LangChain4j (Java棧) 技術棧 Python生態 (FastAPI, LangChain) Java生態 (Spring Boot, Spring AI, LangChain4j) 核心設計哲學 靈活…

Apache 2.0 開源協議詳解:自由、責任與商業化的完美平衡-優雅草卓伊凡

Apache 2.0 開源協議詳解&#xff1a;自由、責任與商業化的完美平衡-優雅草卓伊凡引言由于我們優雅草要推出收銀系統&#xff0c;因此要采用開源代碼&#xff0c;卓伊凡目前看好了一個產品是apache 2.0協議&#xff0c;因此我們有必要深刻理解apache 2.0協議避免觸犯版權問題。…