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.mzph.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…