1、Kafka與消息隊列核心原理詳解

消息隊列(Message Queue, MQ)作為現代分布式系統的基礎組件,極大提升了系統的解耦、異步處理和削峰能力。本文以Kafka為例,系統梳理消息隊列的核心原理、架構細節及實際應用。

Kafka 基礎架構及術語關系圖

在這里插入圖片描述

術語簡要說明

  • Producer:消息生產者,負責發送消息到 Topic。
  • Broker:Kafka 實例,每臺服務器可有一個或多個 Broker,負責存儲和轉發消息。
  • Topic:消息主題,邏輯分類,數據以 Topic 組織。
  • Partition:Topic 的分區,提升并發和吞吐量,每個分區的數據互不重復。
  • Replication:分區副本,提升容錯性,分為 Leader 和 Follower。
  • Message:每條發送的消息主體。
  • Consumer:消息消費者,負責消費 Topic 中的數據。
  • Consumer Group:消費者組,組內消費者協作消費分區數據,提升吞吐量。
  • Zookeeper:Kafka 集群依賴 Zookeeper 存儲元信息,保證系統可用性。

為什么需要消息隊列?

在分布式系統中,服務之間往往需要解耦、異步和高效通信。以快遞和便利店的類比,消息隊列就像"中轉站",讓生產者和消費者解耦:

  • 解耦:生產者和消費者無需直接通信,通過隊列中轉,降低系統耦合度,便于獨立擴展和維護。
  • 異步:生產者無需等待消費者處理完畢,提升整體響應速度和系統吞吐量。
  • 削峰填谷:高峰期消息先入隊,消費者按能力慢慢處理,平滑流量壓力,防止系統被突發流量壓垮。
  • 容錯與可靠性:消息隊列可持久化消息,防止數據丟失,提升系統健壯性。

消息隊列的兩種通信模式

  1. 點對點模式(P2P)
    • 每條消息只被一個消費者消費。
    • 適合任務分發、工作隊列等場景。
    • 消息有明確的發送者和接收者,消費后即被移除。
  2. 發布/訂閱模式(Pub/Sub)
    • 一條消息可被多個訂閱者消費。
    • 適合廣播、通知、日志收集等場景。
    • 生產者將消息發布到主題,所有訂閱該主題的消費者都能收到消息。

Kafka簡介

核心概念與機制

  • Segment(段文件):分區的物理存儲單元,便于管理和查找。
  • Offset:消息在分區內的唯一編號,消費者通過offset定位消費進度。
  • 副本機制:每個分區可配置多個副本(Replica),提升數據可靠性和高可用性。
  • Leader-Follower:每個分區有一個Leader,負責讀寫請求,Follower同步Leader數據。

消息存儲與高效查找

Kafka 在數據持久化方面采用了高效的順序寫入機制。Producer 將數據寫入 Kafka 后,Kafka 會將數據直接順序寫入磁盤,避免了隨機寫入的低效問題。Kafka 啟動時會單獨開辟一塊磁盤空間用于順序寫入,這也是其高并發高吞吐的關鍵。

Partition 結構

每個 Topic 可以分為一個或多個 Partition。Partition 在服務器上的表現形式就是一個個文件夾,每個 Partition 文件夾下包含多組 segment 文件。每組 segment 文件又包含 .index 文件、.log 文件、.timeindex 文件(早期版本中沒有)。

  • .log 文件:實際存儲消息(message)的地方。
  • .index.timeindex 文件:為索引文件,用于高效檢索消息。

如:

  • 一個 Partition 可能有三組 segment 文件,每個 log 文件的大小相同,但存儲的 message 數量可能不同(因每條 message 大小不一)。
  • 文件命名以該 segment 最小 offset 命名,如 000.index 存儲 offset 為 0~368795 的消息。
  • Kafka 通過分段(segment)+ 索引的方式,實現高效查找。
    在這里插入圖片描述
Message 結構

每條消息(message)在 log 文件中的結構主要包括:

  1. offset:8 字節有序 id,唯一標識消息在 partition 內的位置。
  2. 消息大小:4 字節,描述消息體的大小。
  3. 消息體:實際存放的數據(通常已壓縮),大小不定。
存儲策略

Kafka 無論消息是否被消費,都會保存所有消息。對于舊數據,Kafka 提供兩種刪除策略:

  1. 基于時間:如默認 168 小時(7 天)后自動刪除。
  2. 基于大小:如默認 1GB,超出后刪除最早的數據。

需要注意:Kafka 讀取特定消息的時間復雜度為 O(1),刪除過期文件并不會提升查找性能。

  • 消息即使被消費也不會立即刪除,便于多消費者組獨立消費。
  • 這種分段+索引+順序寫入的設計,是 Kafka 能夠兼顧高吞吐與高效檢索的核心。

消費機制與消費組

消息存儲在 log 文件后,消費者即可進行消費。與生產消息類似,消費者在拉取消息時也是直接向分區的 leader 拉取數據。

Kafka 支持多個消費者組成一個消費者組(Consumer Group),每個組有唯一的 group id。組內的每個消費者可以消費同一 topic 下不同分區的數據,但同一分區的數據不會被組內多個消費者重復消費。

  • 當消費者組內的消費者數量小于分區數量時,部分消費者會消費多個分區的數據,導致這些消費者的負載較重。
  • 當消費者數量多于分區數量時,多出來的消費者不會分配到任何分區,不參與消費。
  • 實際應用中,建議消費者組的 consumer 數量與 partition 數量一致,以充分利用并發能力。
offset 查找與高效檢索

Kafka 通過 segment + offset + 稀疏索引 + 二分查找 + 順序查找等機制,實現高效的數據定位。查找某個 offset 的消息流程如下:

  1. 先定位 offset 所在的 segment 文件(利用二分法查找)。
  2. 打開該 segment 的 .index 文件,查找小于或等于目標 offset 的最大相對 offset 條目,獲取其物理偏移量。
  3. 從該物理位置開始順序掃描 log 文件,直到找到目標 offset 的消息。

這種機制依賴 offset 的有序性和稀疏索引,極大提升了查找效率。

offset 管理

每個消費者需要記錄自己消費到的位置(offset)。

  • 早期 Kafka 版本將 offset 存儲在 Zookeeper 中,易導致重復消費且性能有限。
  • 新版本中,offset 已直接存儲在 Kafka 集群的 __consumer_offsets 這個特殊 topic 中,支持斷點續傳和高效管理。

應用場景

  • 日志收集與分析:集中采集應用日志,實時分析與監控。
  • 流式數據處理:與Spark、Flink等流處理框架集成,實現實時大數據分析。
  • 消息驅動架構:微服務間異步通信,解耦業務模塊。
  • 事件溯源與審計:持久化事件流,便于追蹤和回溯。

優缺點分析

優點:

  • 高吞吐、低延遲,適合大規模數據流轉。
  • 分布式架構,易于橫向擴展。
  • 支持消息持久化和多副本,數據可靠性高。
  • 靈活的消費模型,適應多種業務場景。

缺點:

  • 依賴Zookeeper(或KRaft),運維復雜度較高。
  • 消息順序只在分區內保證,跨分區無序。
  • 不適合極端低延遲、強事務場景。

總結

消息隊列通過解耦、異步和削峰,極大提升了系統的彈性和可維護性。Kafka作為業界主流消息中間件,憑借高吞吐、分布式和高可用特性,成為大規模數據流轉的首選。理解其原理和架構,有助于更好地設計和優化分布式系統。

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

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

相關文章

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽初賽-wp

- -考試當場沒做出來 后面做的 misc ? cd misc ? ls num.docx num.zip ? unzip num.docx Archive: num.docxinflating: [Content_Types].xmlinflating: _rels/.relsinflating: word/document.xmlinflating: word/_rels/document.xml.relsextracting: word/media/image1.jp…

JavaScript 到命令和控制 (C2) 服務器惡意軟件分析及防御

攻擊始于一個經過混淆的JavaScript文件,該文件從開源服務中獲取編碼字符串以執行PowerShell腳本。然后,該腳本從一個IP地址和一個URL縮短器下載一個JPG圖像和一個文本文件,這兩個文件都包含使用隱寫術嵌入的惡意MZ DOS可執行文件。這些有效載荷一旦執行,就會部署Stealer惡意…

【計網】ipconfig、ping、arp、tracert

目錄 ipconfig ping arp tracert cmd ipconfig ipcofig -all IPv4 物理地址 ping 檢測網絡連通情況,分析網絡速度 根據域名得到服務器IP 根據TTL判斷對方所使用的操作系統以及數據包經過路由器數量 byte數據包大小 time響應時間 TTLDNS記錄在DNS服務器上存在…

WiFi那些事兒(八)——802.11n

目錄 802.11n 技術簡介與測試項 一、802.11n 技術簡介 (一)標準概述 (二)關鍵技術特性 1. MIMO(多輸入多輸出)技術 2. 信道綁定(Channel Bonding) 3. 幀聚合(Fram…

碼蹄集——直角坐標到極坐標的轉換、射線、線段

目錄 MT1052 直角坐標到極坐標的轉換 MT1066 射線 MT1067 線段 MT1052 直角坐標到極坐標的轉換 思路&#xff1a; arctan()在c中是atan()&#xff0c;結果是弧度要轉換為度&#xff0c;即乘與180/PI 拓展&#xff1a;cos()、sin()在c代碼中表示方式不變 #include<bits/…

深入解析 Linux/Unix 通信機制:從原理到觀測實踐

深入解析 Linux/Unix 通信機制&#xff1a;從原理到觀測實踐 配圖建議&#xff1a;Linux系統架構與通信機制全景示意圖 一、開篇&#xff1a;理解“一切皆文件”的哲學 Unix/Linux 操作系統的核心靈魂在于其獨特的設計哲學。當 Dennis Ritchie 和 Ken Thompson 在貝爾實驗室開…

spring上傳文件添加水印

1、實現 MultipartFile package com.pojo.common.core.domain;import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream;import org.springframework.lang.Nullable; import org.springframework.util.Assert; im…

嵌入式MCU語音識別算法及實現方案

在嵌入式MCU&#xff08;微控制器單元&#xff09;中實現語音識別&#xff0c;由于資源限制&#xff08;如處理能力、內存、功耗等&#xff09;&#xff0c;通常需要輕量級算法和優化技術。以下是常見的語音識別算法及實現方案&#xff1a; 一、傳統語音識別算法 動態時間規整&…

【論文閱讀】DETR+Deformable DETR

可變形注意力是目前transformer結構中經常使用的一種注意力機制&#xff0c;最近補了一下這類注意力的論文&#xff0c;提出可變形注意力的論文叫Deformable DETR&#xff0c;是在DETR的基礎上進行的改進&#xff0c;所以順帶著把原本的DETR也看了一下。 一、DETR DETR本身是…

大模型在宮頸癌診療全流程預測與應用研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、大模型預測宮頸癌術前風險 2.1 術前數據收集與預處理 2.2 預測模型構建與算法選擇 2.3 術前風險預測指標與案例分析 三、大模型輔助制定術中方案 3.1 術中風險動態監測與預測 3.2 基于預測的手術方案優化…

【Python 文件I/O】

Python 的文件 I/O 操作是數據處理的基礎技能&#xff0c;涉及文件的讀寫、路徑管理、異常處理等核心功能。以下是文件 I/O 的核心知識點&#xff1a; 一、基礎文件操作 1. 打開文件 # 通用模式&#xff1a;r(讀)/w(寫)/a(追加) b(二進制)/t(文本&#xff0c;默認) f open(…

Twin Builder 中的電池等效電路模型仿真

電池單元熱設計挑戰 電池熱管理的主要挑戰之一是確保溫度低于最大工作限值。較高的溫度會導致效率降低、加速老化和潛在的安全隱患。工程師必須了解電池產生的熱量&#xff0c;才能充分設計冷卻系統。 了解和預測電池模塊的熱行為需要將電池的熱損耗與電池單元的電氣機械特性…

一種基于條件生成對抗網絡(cGAN)的CT重建算法

簡介 簡介:該文提出了一種基于條件生成對抗網絡(cGAN)的CT重建算法,通過引入CBAM注意力機制增強網絡對關鍵特征的提取能力,有效解決了CT成像中因噪聲干擾導致的重建精度下降問題。實驗采用固體火箭發動機模擬件數據集,將正弦圖分為五組并添加不同程度的噪聲進行訓練。結…

【Redis篇】linux 7.6安裝單機Redis7.0(參數優化詳解)

&#x1f4ab;《博主主頁》&#xff1a; &#x1f50e; CSDN主頁 &#x1f50e; IF Club社區主頁 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(MongoDB)有了…

【BUG】‘DetDataSample‘ object has no attribute ‘_gt_sem_seg‘

問題&#xff1a; 使用mmdetection框架使用COCO格式訓練自定義數據集時&#xff0c;其中模型使用HTC模型時出現如下問題&#xff1a; AttributeError: ‘DetDataSample’ object has no attribute ‘_gt_sem_seg’. Did you mean: ‘gt_sem_seg’? results self(**data, mode…

Java日期格式化方法總結

在Java中&#xff0c;日期格式化主要涉及將 Date、LocalDate、LocalDateTime 等日期時間對象轉換為指定格式的字符串&#xff0c;或將字符串解析為日期對象。以下是兩種常用的日期格式化方式&#xff1a; 一、使用 SimpleDateFormat&#xff08;舊版API&#xff0c;Java 8之前&…

【NLP】27. 語言模型訓練以及模型選擇:從預訓練到下游任務

語言模型訓練&#xff1a;從預訓練到下游任務 本文詳細講解大型語言模型&#xff08;LLMs&#xff09;是如何訓練的&#xff0c;包括不同的模型類型&#xff08;Encoder、Decoder、Encoder-Decoder&#xff09;&#xff0c;以及各類預訓練任務的原理、對比、適用場景&#xff0…

通過 ModernBERT 實現零樣本分類的性能提升

文本分類 是機器學習中最基礎的任務之一&#xff0c;擁有悠久的研究歷史和深遠的實用價值。更重要的是&#xff0c;它是許多實際項目中不可或缺的組成部分&#xff0c;從搜索引擎到生物醫學研究都離不開它。文本分類方法被廣泛應用于科學論文分類、用戶工單分類、社交媒體情感分…

基于SpringBoot網上書店的設計與實現

pom.xml配置文件 1. 項目基本信息(沒什么作用) <groupId>com.spring</groupId> <!--項目組織標識&#xff0c;通常對應包結構--> <artifactId>boot</artifactId> <!--項目唯一標識--> <version>0.0.1-SNAPSHOT</ve…

STM32H743單片機實現ADC+DMA多通道檢測+事件組

在上個文章基礎上改用事件組進行處理&#xff0c;以便實時任務。 stm32cubeMX自動生成代碼 osEventFlagsId_t adctestEventHandle; const osEventFlagsAttr_t adctestEvent_attributes {.name "adctestEvent" };adctestEventHandle osEventFlagsNew(&adctest…