Kafka入門指南:從零開始掌握分布式消息隊列

為什么要有消息隊列

生活中有這樣的場景
在這里插入圖片描述
快遞員將包裹送給買家。
我記得在小時候,收快遞是需要快遞員電話聯系上門時間的。這非常不方便,一方面快遞員手中可能有多個包裹,另一方面買家可能在上班時間抽不出身。
后來有了驛站,快遞員只需要將包裹放入驛站,并通知買家按時取走。這種模式便捷了快遞員和買家雙方。在這里插入圖片描述
驛站的作用類似于“中間件”,它的出現有這些好處
1.解耦系統組件
快遞員和收貨人無需接觸也能完成事件,解放了快遞員和收貨人的時間。
2.異步處理
異步允許事情獨立發生,相互之間不需要等待對方完成。快遞員不需要詢問收貨人是否在家,收貨人不需要等待快遞員上門。
3.流量削峰
收貨人不用面對多個快遞同時抵達在不同位置的尷尬情況。
4.失敗重試與可靠性
允許收貨人因特殊原因當天無法取件(處理失敗),驛站可以將包裹保留幾日。

消息隊列通信的模式

上面的例子中引出了“中間件”的概念,驛站就類似于消息隊列,但消息隊列有不同模式。

兩種模式

1.點對點模式
在這里插入圖片描述
Producer將Message放于Queue中,Consumer從中拉取信息。該模式下,發送到隊列的消息被一個且只有一個消費者進行處理,消費者主動拉取消息的好處是頻率可控,弊端是消費者不知是否有未處理的信息。
2.發布-訂閱模式
在這里插入圖片描述
該模式類似于公眾號,新消息發送給所有關注的用戶。消費者無需考慮是否有未處理的消息。弊端是消費者之間性能的差異帶來的木桶效應,如Consumer1的處理速度為10,而Consumer2的處理速度為3,最后的推送速度只能小于3。但這極大浪費了Cinsumer1的性能。

Kafka

Kafka 本質上是一個 基于發布/訂閱模型 的消息系統。作為一種高吞吐、可水平擴展、持久化、分布式提交日志服務。要想理解Kafka我們要先知道其基礎架構及術語。

基礎架構及術語

在這里插入圖片描述

Broker

Broker是Kafka中的單個服務器節點,一個Kafka可以包含多個Broker,多個Broker組成Kafka集群。每個Broker都可以處理一部分數據(消息的接收、存儲、傳輸)

Topic

消息的邏輯類別或數據流名稱。對消息進行分類和組織,可以把它想象成文件夾名稱。

Partition

是Topic的分區,一個Topic可能有多個分區。Partition 是 Kafka 實現并行處理和高吞吐的關鍵。生產者和消費者可以并行地與多個 Partition 交互。

Replica

Partition 的副本。每個 Partition 可以有多個 Replica,分布在不同的Broker上,用于容錯。

Leader Replica/Follower Replica

每個 Partition 在某一時刻只有一個 Leader。所有針對該 Partition 的讀寫請求(生產和消費)都必須由 Leader 處理。
從 Leader Replica 復制數據。如果 Leader 失效,其中一個 Follower 會被選舉為新的 Leader。

In-Sync Replica (ISR)

指那些與 Leader Replica 保持足夠同步的 Replica 集合(包括 Leader 自身)。只有 ISR 中的 Follower 才有資格在 Leader 失效時被選舉為新的 Leader。

Producer

向 Kafka Topic 發布消息的客戶端應用程序,即是生產者,是消息的入口。

Consumer

從 Kafka Topic 訂閱并讀取消息的客戶端應用程序,即是消費者,是消息的出口。

Consumer Group

將多個消費組組成一個消費者組。同一個分區的數據只能被消費者組中某一個用戶消費,同一個消費者組的消費者可以在同一個Topic上消費不同分區(并行)。

ZooKeeper

Kafka 集群依賴 ZooKeeper 集群來存儲和管理關鍵的元數據。

流程分析

發送數據

寫入數據時,Producer先找到Leader,將數據寫入Leader。這個過程展開來說如此:
1.將消息發給Leader
2.Leader寫入數據
3.Follower同步Leader的消息
4.Follower發送ack表示同步完成
5.Leader收到所有Follwer的ack后向Producer發送ack,表示過程結束

ack是什么?
acks(Acknowledgments)是生產者(Producer)配置的核心參數之一,用于控制消息寫入的可靠性級別。 它決定了生產者認為消息“成功發送”之前,需要多少個分區副本(Replica)確認收到該消息。
通常ack有三種配置:0、1、all

0代表不等待確認,生產者發送消息后立即認為成功,不等待Broker回應。可靠性最低但效率最高。
1代表Leader確認,生產者等待Leader將消息寫入本地。可靠性和效率都是中等。
all代表全副本確認,等待ISR中所有副本都成功寫入消息。可靠性最高但效率最低。

保存數據

Kafka會單獨開辟一塊磁盤空間,順序寫入數據。

Partition 結構

每個 Partition 是一個 追加寫入的日志文件(Append-only Log),存儲在磁盤上。Kafka 使用日志文件來持久化消息,每個 Partition 對應一個目錄,目錄下包含多個日志文件(Segment)。

<topic-name>-<partition-id>/
├── 00000000000000000000.index
├── 00000000000000000000.log
├── 00000000000000000000.timeindex
├── 00000000000000000001.index
├── 00000000000000000001.log
├── 00000000000000000001.timeindex
└── ...

Partition 的選擇策略

當生產者發送消息到某個 Topic 時,Kafka 會根據以下策略選擇將消息寫入哪個 Partition:
1.指定 Partition:生產者可以顯式指定 Partition
2.Key Hash:如果消息有 Key,則默認使用 Key 的 Hash 值取模 Partition 數量
3.輪詢:沒有 Key 時,默認輪詢方式分配 Partition

數據保留策略

Kafka可以通過配置來設置數據的保留策略,包括基于時間的保留(如7天)和基于大小的保留(如1GB)。一旦數據超過了這些限制,就會被刪除以釋放空間。

消費數據

Kafka支持點對點和發布訂閱兩種模式。當單個消費者時,采取類似點對點模式;消費群組時,采用發布訂閱模式。
前文提到過多個消費者組成的消費者組,每個消費者組有其獨特的編號,同一個消費者組的消費者可以消費同一Topic下不同分區的數據,但是不會組內多個消費者消費同一分區的數據。

如果消費者數量和分區數量不一致:
消費者數量<分區數量 —— 有的消費者會消費多個分區,效率低于消化單個分區的消費者
消費者數量>分區數量 —— 多出來的消費者不消化數據

查找數據

Kafka 的查找數據過程是其高性能和高吞吐量的核心機制之一。Kafka 通過稀疏索引、日志段(Log Segment) 和 二分查找算法 實現高效的數據檢索。
Kafka查找數據過程分為兩個主要步驟:

  1. 定位目標日志段(Log Segment)
  2. 在日志段中查找具體消息

定位日志段

是 Kafka 存儲消息的基本單元,每個 Partition 被劃分為多個日志段(00000000000000000000.log 和 00000000000000000099.log)。

第一個日志段的起始偏移量為 0,后續日志段的起始偏移量為上一個日志段的最后一條消息的 offset。

Kafka使用二分查找算法在日志段列表中定位目標。

offset

即是偏移量,用于標識消息在 Kafka 分區(Partition)中的唯一位置。它是 Kafka 實現消息順序性、消費進度追蹤和數據可靠性管理的關鍵機制。
它有如下作用:
1.標識消息在分區中的位置
2.保證消息在分區內有序性
3.跟蹤消費者的消費進度

查找具體消息

Kafka 的每個日志段包含兩個關鍵文件:.log 文件 和.index 文件(稀疏索引)

稀疏索引:每隔一定字節數(默認 4KB)為一條消息創建索引項。如1、2、3、4、5… ——> 1、3、5…

整體流程概括為:稀疏索引 + 二分查找 + 順序寫入 + 內存映射

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

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

相關文章

基于Matlab圖像處理的瓶子自動檢測與質量評估系統

本文提出了一種基于圖像處理的瓶子缺陷檢測系統&#xff0c;旨在通過圖像分析自動識別和檢測瓶子在生產過程中可能出現的缺陷。系統首先通過圖像預處理技術&#xff0c;包括灰度轉換、二值化處理、噪聲去除等步驟&#xff0c;將原始圖像轉換為適合分析的格式。然后&#xff0c;…

【Pandas】pandas Index objects Index.name

Pandas2.2 Index objects Properties方法描述Index.values返回 Index 對象的值&#xff0c;通常是一個 NumPy 數組Index.is_monotonic_increasing用于檢查索引的元素是否 單調遞增Index.is_monotonic_decreasing用于判斷索引的值是否 單調遞減Index.is_unique用于檢查索引中的標…

JDBC教程,2025版最新講解.超詳細入門教程

以下內容全面詳盡地梳理了 JDBC &#xff08;Java Database Connectivity&#xff09;的核心知識點&#xff0c;并在關鍵環節配以示例代碼。若要快速定位&#xff0c;可先查看下方結構&#xff1a; JDBC 概覽驅動加載與注冊獲取數據庫連接執行 SQL&#xff08;Statement、Prepa…

PyTorch中nn.Module詳解和綜合代碼示例

在 PyTorch 中&#xff0c;nn.Module 是神經網絡中最核心的基類&#xff0c;用于構建所有模型。理解并熟練使用 nn.Module 是掌握 PyTorch 的關鍵。一、什么是 nn.Module nn.Module 是 PyTorch 中所有神經網絡模塊的基類。可以把它看作是“神經網絡的容器”&#xff0c;它封裝了…

深入解析三大Web安全威脅:文件上傳漏洞、SQL注入漏洞與WebShell

文章目錄文件上傳漏洞SQL注入漏洞WebShell三者的核心關聯&#xff1a;攻擊鏈閉環文件上傳漏洞 文件上傳漏洞&#xff08;File Upload Vulnerability&#xff09; 當Web應用允許用戶上傳文件但未實施充分的安全驗證時&#xff0c;攻擊者可上傳惡意文件&#xff08;如WebShell、…

【對比】群體智能優化算法 vs 貝葉斯優化

在機器學習、工程優化和科學計算中&#xff0c;優化算法的選擇直接影響問題求解的效率與效果。群體智能優化算法&#xff08;Swarm Intelligence, SI&#xff09;和貝葉斯優化&#xff08;Bayesian Optimization, BO&#xff09;是兩種截然不同的優化范式&#xff0c;分別以不同…

LLMs之Agent:ChatGPT Agent發布—統一代理系統將研究與行動無縫對接,開啟智能助理新時代

LLMs之Agent&#xff1a;ChatGPT Agent發布—統一代理系統將研究與行動無縫對接&#xff0c;開啟智能助理新時代 目錄 OpenAI重磅發布ChatGPT Agent—統一代理系統將研究與行動無縫對接&#xff0c;開啟智能助理新時代 第一部分&#xff1a;Operator 和深度研究的自然演進 第…

Linux726 raid0,raid1,raid5;raid 創建、保存、停止、刪除

RAID創建 創建raid0 安裝mdadm yum install mdadm mdadm --create /dev/md0 --raid-devices2 /dev/sdb5 /dev/sdb6 [rootsamba caozx26]# mdadm --create /dev/md0 --raid-devices2 /dev/sdb3 /dev/sdb5 --level0 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev…

深入剖析 MetaGPT 中的提示詞工程:WriteCode 動作的提示詞設計

今天&#xff0c;我想和大家分享關于 AI 提示詞工程的文章。提示詞&#xff08;Prompt&#xff09;是大型語言模型&#xff08;LLM&#xff09;生成高質量輸出的關鍵&#xff0c;而在像 MetaGPT 這樣的 AI 驅動軟件開發框架中&#xff0c;提示詞的設計直接決定了代碼生成的可靠…

關于 ESXi 中 “ExcelnstalledOnly 已禁用“ 的解決方案

第一步&#xff1a;使用ssh登錄esxi esxcli system settings advanced list -o /User/execInstalledOnly可能會得到以下內容 esxcli system settings advanced list -o /User/execInstalledOnlyPath: /User/ExecInstalledOnlyType: integerInt Value: 0Default Int Value: 1Min…

HTML5 Canvas 繪制圓弧效果

HTML5 Canvas 繪制圓弧效果 以下是一個使用HTML5 Canvas繪制圓弧的完整示例&#xff0c;你可以直接在瀏覽器中運行看到效果&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"view…

智能Agent場景實戰指南 Day 18:Agent決策樹與規劃能力

【智能Agent場景實戰指南 Day 18】Agent決策樹與規劃能力 開篇 歡迎來到"智能Agent場景實戰指南"系列的第18天&#xff01;今天我們將深入探討智能Agent的核心能力之一&#xff1a;決策樹與規劃能力。在現代業務場景中&#xff0c;Agent需要具備類似人類的決策能力…

AI 編程工具 Trae 重要的升級。。。

大家好&#xff0c;我是櫻木。 今天打開 Trae &#xff0c;已經看到它進行圖標升級&#xff0c;之前的圖標&#xff0c;國際和國內版本長得非常像&#xff0c;現在做了很明顯的區分&#xff0c;這點給 Trae 團隊點個贊。 自從 Claude 使出了壓力以來&#xff0c;Cursor 鎖區&…

排序算法,咕咕咕

1.選擇排序void selectsort(vector<int>& v) { for(int i0;i<v.size()-1;i) {int minii;for(int ji1;j<v.size();j){if(v[i]>v[j]){minij;}}if(mini!i)swap(v[i],v[mini]); } }2.堆排序void adjustdown(vector<int>& v,int root,int size) { int …

數據庫查詢系統——pyqt+python實現Excel內查課

一、引言 數據庫查詢系統處處存在&#xff0c;在教育信息化背景下&#xff0c;數據庫查詢技術更已深度融入教務管理場景。本系統采用輕量化架構&#xff0c;結合Excel課表&#xff0c;通過PythonPyQt5實現跨平臺桌面應用&#xff0c;以實現簡單查課效果。 二、GUI界面設計 使用…

base64魔改算法 | jsvmp日志分析并還原

前言 上一篇我們講了標準 base64 算法還原&#xff0c;為了進一步學習 base64 算法特點&#xff0c;本文將結合 jsvmp 日志&#xff0c;實戰還原出 base64 魔改算法。 為了方便大家學習&#xff0c;我將入參和上篇文章一樣&#xff0c;入參為 Hello, World!。 插樁 在js代碼中&…

vue3筆記(2)自用

目錄 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念與用法 1. 安裝與初始化 2. 創建 Store 3. 在組件中使用 Store 4. 高級用法 5、storeToRefs 二、Pinia 與 Vuex 的主要區別 三、為什么選擇 Pinia&#xff1f; 三、定義全局指令 1.封裝通用 DOM 操作&#…

大模型面試回答,介紹項目

1. 模型準備與轉換&#xff08;PC端/服務器&#xff09;你先在PC上下載或訓練好大語言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型轉換成瑞芯微NPU能用的專用格式&#xff08;.rkllm&#xff09;&#xff0c;并可選擇量化優化。把轉換好的模型文件拷…

Oracle 19.20未知BUG導致oraagent進程內存泄漏

故障現象查詢操作系統進程的使用排序&#xff0c;這里看到oraagent的物理內存達到16G&#xff0c;遠遠超過正常環境&#xff08;正常環境在19.20大概就是100M多一點&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

嘗試幾道算法題,提升python編程思維

一、跳躍游戲題目描述&#xff1a; 給定一個非負整數數組 nums&#xff0c;你最初位于數組的第一個下標。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標。示例&#xff1a;輸入&#xff1a;nums [2,3,1,1,4] → 輸出&#xff1a;True輸入…