当前位置: 首页 > article >正文

【西瓜带你学Kafka | 第三期】Kafka从消息生产到集群管理的完整链路(文含图解)

Kafka 核心机制全解析生产者流程、消费模式与集群管理Kafka 的强大不仅在于能用更在于每个环节的设计都经过深思熟虑。这篇博客从一条消息的诞生到被消费再到集群如何自我管理带你完整走一遍 Kafka 的核心工作机制。文章目录Kafka 核心机制全解析生产者流程、消费模式与集群管理一、Kafka 中生产者运行流程完整流程二、Kafka 中的消息封装Batch 机制Batch 的控制维度效率与时效性的权衡三、Kafka 消息的消费模式Push 模式的问题Kafka 选择了 Pull 模式Pull 模式的缺点与解决方案四、Kafka 中消费者与消费者组的关系与负载均衡Consumer Group 机制消费者数量的最佳实践动态关系与 Rebalance心跳与协调者五、Kafka 如何实现负载均衡与故障转移负载均衡故障转移六、Kafka 中 Zookeeper 的作用七、Kafka 提供了哪些系统工具总结一、Kafka 中生产者运行流程一条消息从 Producer 发出到最终抵达 Broker中间经历了六个步骤。理解这个流程是掌握 Kafka 生产端调优的基础。完整流程1. 封装 ProducerRecord一条消息发过来首先会被封装成一个ProducerRecord对象。这个对象包含了目标 Topic、Partition可选、Key可选、Value消息体以及 Timestamp 等信息。// 构造一个 ProducerRecordProducerRecordString,StringrecordnewProducerRecord(order-topic,// 目标 TopicorderId-1001,// Key下单成功// Value);第一个 StringKey 的类型第二个 StringValue 的类型2. 序列化处理对 ProducerRecord 对象进行序列化将 Key 和 Value 转换为字节数组。可以使用 Kafka 内置的序列化器如 StringSerializer也可以自定义序列化逻辑。3. 分区处理序列化完成后对消息进行分区处理。这一步需要获取集群的元数据Metadata决定这条消息会被发送到哪个主题的哪个分区。分区策略就是上篇博客讲过的三级规则指定Partition → Key 哈希取余 → Round-Robin。点西瓜带你学Kafka跳转上期4. 写入缓存区分好区的消息不会直接发送到服务端而是放入生产者的缓存区RecordAccumulator。多条发往同一分区的消息会被封装成一个批次Batch默认一个批次的大小是16KB。5. Sender 线程获取批次Sender 线程是一个独立的后台线程启动以后会持续从缓存区里获取可以发送的批次。6. 发送到服务端Sender 线程把一个一个批次通过网络发送到对应的 Broker。【图片描述词】Kafka 生产者运行流程图从左到右依次为① 消息封装为 ProducerRecord → ② Serializer 序列化 → ③ Partitioner 分区旁边有一个虚线框标注获取集群 Metadata→ ④ 写入 RecordAccumulator 缓存区内部展示多个 Batch 按 Partition 分组排列→ ⑤ Sender 线程从缓存区取出 Batch → ⑥ 通过网络发送到 Kafka Broker。整体用流水线风格箭头连接各步骤主线程和 Sender 线程用不同颜色区分。// 完整的 Producer 发送示例PropertiespropsnewProperties();props.put(bootstrap.servers,localhost:9092);props.put(key.serializer,org.apache.kafka.common.serialization.StringSerializer);props.put(value.serializer,org.apache.kafka.common.serialization.StringSerializer);// 批次大小默认 16KBprops.put(batch.size,16384);//16*1024// 等待时间配合 batch.size 一起控制批次发送props.put(linger.ms,10);KafkaProducerString,StringproducernewKafkaProducer(props);producer.send(newProducerRecord(order-topic,orderId-1001,下单成功),(metadata,exception)-{if(exceptionnull){System.out.printf(发送成功: topic%s, partition%d, offset%d%n,metadata.topic(),metadata.partition(),metadata.offset());}else{exception.printStackTrace();}});producer.close();注意看代码中的两个关键参数batch.size和linger.ms它们直接影响批次的行为二、Kafka 中的消息封装Batch 机制Producer 并不是来一条消息就发一条而是通过 Batch 的方式批量推送数据以此提高效率。Batch 的控制维度Kafka Producer 可以将消息在内存中累积到一定程度后作为一个 Batch 发送请求。Batch 的触发条件可以从三个维度进行控制维度参数示例值说明累计消息数量batch.size间接控制500 条消息条数达到阈值时触发发送累计时间间隔linger.ms100ms即使 Batch 未满超过等待时间也会发送累计数据大小batch.size64KBBatch 的字节数达到阈值时触发发送三个条件是或的关系——任何一个先满足Batch 就会被发送。效率与时效性的权衡通过增加 Batch 的大小可以减少网络请求和磁盘 I/O 的频次吞吐量会显著提升。但代价是单条消息的延迟会增加因为要等 Batch 凑够。追求高吞吐调大batch.size调大linger.ms追求低延迟调小batch.size将linger.ms设为 0来一条发一条具体参数配置需要根据业务场景在效率和时效性之间做权衡。三、Kafka 消息的消费模式Kafka 采用大部分消息系统遵循的传统模式Producer 将消息推送到 BrokerConsumer 从 Broker 获取消息。但 Consumer 从 Broker 获取消息这一步到底是 Push 还是 Pull这个选择直接影响系统的灵活性。Push 模式的问题如果采用 Push 模式Broker 主动推送消息给 ConsumerConsumer 难以处理不同速率的上游推送。快的 Producer 会把慢的 Consumer 压垮而 Broker 很难感知每个 Consumer 的实际处理能力。Kafka 选择了 Pull 模式Kafka 的 Consumer 采用 Pull 模式主动从 Broker 拉取数据。好处是Consumer 可以自主决定消费速率根据自身处理能力按需拉取Consumer 可以自主决定是否批量拉取灵活控制每次拉取的数据量Pull 模式的缺点与解决方案Pull 模式有一个天然缺点如果 Broker 没有可供消费的消息Consumer 会不断在循环中轮询直到新消息到达造成 CPU 空转。Kafka 的解决方案提供一个fetch.min.bytes参数让 Consumer 在没有新消息时阻塞等待直到有足够的新消息到达后才返回避免无意义的空轮询。PropertiespropsnewProperties();props.put(bootstrap.servers,localhost:9092);props.put(group.id,order-consumer-group);props.put(key.deserializer,org.apache.kafka.common.serialization.StringDeserializer);props.put(value.deserializer,org.apache.kafka.common.serialization.StringDeserializer);// 最少拉取 1 字节数据没有数据时阻塞等待props.put(fetch.min.bytes,1);// 最长阻塞等待时间 500msprops.put(fetch.max.wait.ms,500);KafkaConsumerString,StringconsumernewKafkaConsumer(props);consumer.subscribe(Collections.singletonList(order-topic));while(true){// poll 内部实现了 Pull 模式 阻塞等待ConsumerRecordsString,Stringrecordsconsumer.poll(Duration.ofMillis(1000));for(ConsumerRecordString,Stringrecord:records){System.out.printf(offset%d, key%s, value%s%n,record.offset(),record.key(),record.value());}}四、Kafka 中消费者与消费者组的关系与负载均衡Consumer Group 机制Consumer Group 是 Kafka 独有的可扩展且具有容错性的消费者机制。核心规则一个组内可以有多个 Consumer它们共享一个全局唯一的Group ID组内所有 Consumer 协调在一起消费订阅 Topic 内的所有 Partition每个 Partition 只能由同一个 Consumer Group 内的一个 Consumer 来消费Consumer订阅的是 Topic 的 Partition而不是 Message所以在同一时间点上订阅到同一个分区的 Consumer 必然属于不同的 Consumer Group。消费者数量的最佳实践消费者的数量通常不超过分区的数量且二者最好保持整数倍的关系。原因很简单如果 Consumer 数量超过 Partition 数量多出来的 Consumer 会处于空闲状态白白浪费资源。Partition 数Consumer 数效果33每个 Consumer 消费 1 个 Partition完美均衡32一个 Consumer 消费 2 个 Partition另一个消费 1 个343 个 Consumer 各消费 1 个 Partition1 个空闲动态关系与 RebalanceConsumer Group 与 Consumer 的关系是动态维护的当一个 Consumer 进程挂掉或卡住时该 Consumer 所订阅的 Partition 会被重新分配到该组内的其他 Consumer 上当一个新的 Consumer 加入到 Consumer Group 中时会从其他 Consumer 中分配出一个或多个 Partition 给这个新成员心跳与协调者为了维持 Consumer 与 Consumer Group 之间的关系Consumer 会周期性地发送heartbeat到Coordinator协调者。如果 heartbeat 超时或未收到 heartbeatCoordinator 会认为该 Consumer 已经退出该 Consumer 所订阅的 Partition 会被分配到同一组内的其他 Consumer 上这个过程称为Rebalance再平衡PropertiespropsnewProperties();props.put(bootstrap.servers,localhost:9092);// 指定 Consumer Groupprops.put(group.id,order-consumer-group);// 心跳间隔默认 3 秒props.put(heartbeat.interval.ms,3000);// 会话超时时间超过此时间未收到心跳则触发 Rebalanceprops.put(session.timeout.ms,30000);props.put(key.deserializer,org.apache.kafka.common.serialization.StringDeserializer);props.put(value.deserializer,org.apache.kafka.common.serialization.StringDeserializer);KafkaConsumerString,StringconsumernewKafkaConsumer(props);consumer.subscribe(Collections.singletonList(order-topic));五、Kafka 如何实现负载均衡与故障转移负载均衡负载均衡是指让系统的负载根据一定的规则均衡地分配在所有参与工作的服务器上从而最大限度保证系统整体运行效率与稳定性。Kafka 的负载均衡就是让每个 Broker 都有均等的机会为客户端生产者与消费者提供服务将负载分散到集群中的所有机器上。实现方式Kafka 通过智能化的分区领导者选举来实现负载均衡。它提供智能化的 Leader 选举算法可在集群的所有机器上均匀分散各个 Partition 的 Leader从而整体上实现负载均衡。因为所有的读写请求都由 Leader 处理所以 Leader 的分布是否均匀直接决定了集群负载是否均衡。故障转移Kafka 的故障转移是通过会话机制实现的每台 Kafka 服务器启动后会以会话的形式把自己注册到 Zookeeper 服务器上一旦服务器运转出现问题就会导致与 Zookeeper 的会话不能维持从而超时断连此时 Kafka 集群会选举出另一台服务器来完全替代这台服务器继续提供服务【图片描述词】分为上下两部分。上半部分标注正常状态3 个 Broker 都与 Zookeeper 保持会话连接用绿色实线表示各自持有不同 Partition 的 Leader。下半部分标注故障转移Broker 1 宕机用红色叉号标记与 Zookeeper 的连接断开用红色虚线表示Broker 1 上的 Partition Leader 被转移到 Broker 2 上用箭头标注Leader 重新选举Broker 2 变为新的 Leader 继续提供服务。六、Kafka 中 Zookeeper 的作用Kafka 是一个使用 Zookeeper 构建的分布式系统。Zookeeper 在 Kafka 中扮演着大管家的角色职责说明Broker 注册管理各 Broker 启动时在 Zookeeper 上注册由 Zookeeper 统一协调管理分区信息维护同一 Topic 的消息被分成多个分区并分布在多个 Broker 上这些分区信息及与 Broker 的对应关系由 Zookeeper 维护故障恢复如果任何节点失败可通过 Zookeeper 从先前提交的偏移量中恢复因为 Zookeeper 会做周期性提交偏移量工作Controller 选举集群中的 Controller 角色通过 Zookeeper 选举产生值得一提的是从 Kafka 2.8 开始引入了KRaft 模式目标是去除对 Zookeeper 的依赖让 Kafka 自己管理元数据。Kafka 3.3 已经将 KRaft 标记为生产可用这是 Kafka 架构演进的重要方向。七、Kafka 提供了哪些系统工具Kafka 自带了一些实用的系统工具虽然不算丰富但覆盖了运维中的关键场景工具用途Kafka 迁移工具有助于将代理从一个版本迁移到另一个版本降低版本升级的风险MirrorMaker将一个 Kafka 集群的镜像提供给另一个集群常用于跨数据中心的数据同步和灾备消费者检查工具对于指定的主题集和消费者组可显示主题、分区、所有者等信息方便排查消费进度和分配情况总结生产者流程消息经历封装 → 序列化 → 分区 → 缓存 → Sender 线程批量发送六步完成从 Producer 到 Broker 的旅程Batch 机制通过消息数量、时间间隔、数据大小三个维度控制批次在吞吐量和延迟之间做权衡消费模式Kafka 选择 Pull 模式Consumer 自主控制消费速率通过阻塞参数解决空轮询问题消费者组Partition 与 Consumer 的动态绑定通过 heartbeat Coordinator 实现 Rebalance负载均衡与故障转移Leader 均匀分散实现负载均衡Zookeeper 会话机制实现故障自动转移Zookeeper集群的元数据管家管理 Broker 注册、分区分配、故障恢复等核心信息Kafka 的每一个环节都在追求一个目标用最少的资源开销实现最高的吞吐和最强的可靠性。

相关文章:

【西瓜带你学Kafka | 第三期】Kafka从消息生产到集群管理的完整链路(文含图解)

Kafka 核心机制全解析:生产者流程、消费模式与集群管理 Kafka 的强大不仅在于"能用",更在于每个环节的设计都经过深思熟虑。这篇博客从一条消息的诞生到被消费,再到集群如何自我管理,带你完整走一遍 Kafka 的核心工作机…...

魔兽争霸3兼容性修复完全指南:让经典游戏在现代电脑上流畅运行

魔兽争霸3兼容性修复完全指南:让经典游戏在现代电脑上流畅运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Windows …...

跨平台应用革命:Windows上的Android应用安装神器

跨平台应用革命:Windows上的Android应用安装神器 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为安装Android应用而烦恼吗?想要在Windows…...

走向Agent-Native!360AI知识库打通业务底座,让人与AI自然协同

当行业还在讨论AI如何“答得更好”时,360亿方智能已率先让AI“做得更多”。 如今,360AI知识库通过“MCPCLISkill”的三位一体架构,正逐步从“知识沉淀中枢”走向具备自主执行能力的企业级AI操作系统。通过深度融合底层连接、工程化控制与场景…...

如何在老旧电脑上安装Windows 11:MediaCreationTool.bat全面指南

如何在老旧电脑上安装Windows 11:MediaCreationTool.bat全面指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat…...

[特殊字符] 窗口管理功能对比表

📋 窗口管理功能对比表 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 功能Windows 11原生ExplorerPatcher增强AltTab界面卡片式预…...

超越向量检索:构建确定性三层数据图RAG系统,告别事实混淆!

向量数据库长期以来一直是现代检索增强生成(RAG)管道的基石,在基于语义相似性检索长文本方面表现出色。然而,在处理原子事实、数字和严格实体关系时,向量数据库是出了名的"有损的"。 例如,一个标…...

抖音批量下载器:如何用开源工具解决内容收集的三大痛点

抖音批量下载器:如何用开源工具解决内容收集的三大痛点 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

Ubuntu 20.04上D435i驱动安装踩坑实录:从SDK2.0到ROS包,我遇到的5个问题及解法

Ubuntu 20.04上D435i驱动安装实战:5个典型问题深度解析与解决方案 当你在Ubuntu 20.04上尝试为Intel RealSense D435i深度相机配置开发环境时,可能会遇到各种意想不到的问题。这篇文章不是又一篇按部就班的安装教程,而是聚焦于那些官方文档很…...

从‘奇数单增序列’出发,聊聊编程中数据过滤与排序的几种常见思路(附Python/Java实现)

从数据过滤到排序输出:多语言视角下的编程范式实践 在编程的世界里,数据处理是最基础也最核心的技能之一。无论是处理用户输入、分析日志文件,还是构建复杂的算法,我们经常需要从原始数据中筛选出有价值的部分,然后按照…...

别再手动改编号了!用Word交叉引用+Zotero插件,搞定毕业论文格式的完整流程

毕业论文格式自动化:Word交叉引用与Zotero插件的终极解决方案 凌晨三点的电脑屏幕前,你正在疯狂点击"更新域"按钮,却发现论文中的图表编号全部错乱——这不是恐怖片场景,而是每个毕业生都可能遭遇的"格式灾难"…...

保姆级教程:用MMAction2训练你的第一个自定义动作识别模型(从数据集准备到模型训练)

从零开始构建自定义动作识别模型:MMAction2实战指南 动作识别技术正在重塑多个行业的交互方式——从健身应用的实时动作纠正到工业质检中的异常行为检测。作为OpenMMLab生态中的重要成员,MMAction2以其模块化设计和丰富的预训练模型,成为开发…...

终极Windows驱动管理解决方案:DriverStore Explorer完全指南

终极Windows驱动管理解决方案:DriverStore Explorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾经因为C盘空间不足而烦恼?是否遇到过因旧驱…...

ROS项目里OpenCV版本打架了?保姆级教程教你让OpenCV 3和4在Ubuntu 20.04上和平共处

ROS项目中OpenCV多版本共存实战指南 当ROS遇上OpenCV版本冲突 机器人操作系统(ROS)开发者们经常遇到一个令人头疼的问题:新项目需要OpenCV 4的最新特性,而老项目却固执地依赖OpenCV 3的某些接口。这种版本冲突在Ubuntu 20.04上尤为常见,因为R…...

B站视频永久保存终极攻略:m4s-converter一键转换全解析

B站视频永久保存终极攻略:m4s-converter一键转换全解析 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 还在为B站视频突然下架而焦虑…...

Flutter网络请求高级指南

Flutter网络请求高级指南 引言 在现代移动应用开发中,网络请求是一个核心功能,几乎所有应用都需要与后端服务器进行通信。Flutter提供了多种网络请求方案,从基础的http包到功能强大的dio库,开发者可以根据自己的需求选择合适的方案…...

告别卡顿!用Unreal 5的Niagara和顶点动画,轻松渲染上万“小兵”

突破性能极限:Unreal 5 Niagara与顶点动画实现万人同屏实战指南 当屏幕上同时出现数百个角色时,帧率骤降是每个UE5开发者都经历过的噩梦。骨骼动画的计算开销、移动组件的性能消耗、DrawCall的堆积,这些问题在大规模群体渲染时会被无限放大。…...

APP兼容性测试前期准备全攻略:筑牢测试根基,保障应用适配无忧

兼容性测试是确保App在不同设备、系统版本和网络环境下稳定运行的关键环节。在正式开始测试之前,充分的准备工作能大幅提升效率与覆盖率。一、明确兼容性测试核心目标与范围首先要清晰界定测试目标,避免测试工作盲目开展。核心目标是验证APP在不同终端、…...

从双11到某省政务平台:信息系统架构的本质思考

从双11到某省政务平台:信息系统架构的本质思考 一、架构不是设计出来的,是长出来的 某电商巨头今天的架构,是业务增长、填坑、拆分、迭代的结果,不是一开始就"神设计"。 核心技术底座大量依赖开源产品(K8s 等…...

从手机全景到安防监控:聊聊图像拼接(Image Stitching)技术在实际项目里的那些坑

图像拼接实战指南:从算法原理到工程避坑 当你在旅游景点举起手机拍摄全景照片时,是否好奇过背后的技术如何将多张照片无缝拼接?当安防监控系统需要将多个摄像头画面整合成全景视图时,工程师们又面临哪些挑战?图像拼接技…...

设备机箱机柜批量生产厂家

设备机箱机柜批量生产厂家怎么选?掌握这些要点不踩坑在现代工业领域,设备机箱机柜生产至关重要,它为各种设备提供保护和支撑,确保设备稳定运行。选择一家合适的设备机箱机柜批量生产厂家,对于企业的生产和发展意义重大…...

Windows Terminal美化避坑指南:手把手解决Oh-My-Posh字体乱码、主题不生效问题

Windows Terminal美化避坑实战:Oh-My-Posh疑难杂症全解析 当你第一次看到别人炫酷的终端界面时,那种心动的感觉我完全理解。但现实往往是骨感的——Nerd Fonts装了半天还是显示乱码,精心挑选的主题死活不生效,环境变量像迷宫一样让…...

TV Bro电视浏览器终极指南:用遥控器轻松掌控大屏上网体验

TV Bro电视浏览器终极指南:用遥控器轻松掌控大屏上网体验 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro 想在智能电视上畅游互联网世界,却苦于遥…...

强力AI填充插件Fillinger:3分钟掌握20倍效率提升的完整指南

强力AI填充插件Fillinger:3分钟掌握20倍效率提升的完整指南 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中重复繁琐的图案填充而烦恼吗&…...

鼠标滚动优化终极指南:如何让Mac外接鼠标拥有触控板般的顺滑体验

鼠标滚动优化终极指南:如何让Mac外接鼠标拥有触控板般的顺滑体验 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction indep…...

从45分钟到5分钟:Brigadier如何彻底改变Mac Boot Camp驱动部署体验

从45分钟到5分钟:Brigadier如何彻底改变Mac Boot Camp驱动部署体验 【免费下载链接】brigadier Fetch and install Boot Camp ESDs with ease. 项目地址: https://gitcode.com/gh_mirrors/bri/brigadier 在混合设备管理成为企业IT新常态的今天,Ma…...

LeetCode 斐波那契搜索题解

LeetCode 斐波那契搜索题解 题目描述 实现斐波那契搜索算法,在一个有序整数数组中查找目标值。 示例: 输入:[11, 12, 22, 25, 34, 64, 90],目标值:22输出:2(目标值在数组中的索引) 解…...

如何快速解密QQ音乐加密文件:qmcdump完整使用指南

如何快速解密QQ音乐加密文件:qmcdump完整使用指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经…...

别再让 Agent 盲目“猜”了!揭秘 CareerPilot 如何用 PaddleOCR 打造职业规划的“第一道防线”

大家在聊起 AI Agent(智能体) 时,脑海中浮现的第一个画面是什么? 是一个无所不知的聊天窗口?还是一个能自动写代码的机器人? 在很多人的认知里,Agent 的核心似乎就是“对话”。但在职业规划这…...

200+小说网站一键下载:novel-downloader终极离线阅读解决方案

200小说网站一键下载:novel-downloader终极离线阅读解决方案 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代,你是否曾担心心爱的小说突然消失…...