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

Kafka Consumer Group 详解:原理、机制与应用实践

Kafka Consumer Group 详解原理、机制与应用实践前言什么是 Consumer Group核心特征Consumer Group 的核心作用1. 实现发布-订阅模式2. 实现消息队列模式3. 消费能力的水平扩展4. 故障自动转移Consumer Group 的工作原理核心组件工作流程分区分配策略1. Range 分配策略默认2. RoundRobin 分配策略3. Sticky 分配策略分区与消费者的关系消费者加入和离开 Group 的过程消费者加入 GroupJoinGroup消费者离开 GroupLeaveGroup消费位移Offset管理自动提交默认手动提交实战代码示例创建 Consumer Group 的消费者查看 Consumer Group 状态最佳实践建议1. 合理设置消费者数量2. 选择合适的提交方式3. 监控 Consumer Group 状态4. 处理 Rebalance 监听器总结The Begin点点关注收藏不迷路前言在分布式消息系统中如何高效地消费消息是一个核心问题。Apache Kafka 通过Consumer Group消费者组这一精妙的设计完美解决了多个消费者协同消费、负载均衡、故障转移等问题。本文将深入剖析 Consumer Group 的工作原理、核心机制并通过流程图和代码示例帮助读者全面理解。什么是 Consumer GroupConsumer Group是 Kafka 中逻辑上的消费者集群由一个或多个消费者实例组成。这些消费者实例共同消费一个或多个主题Topic的所有消息。每个 Consumer Group 有一个唯一的 Group ID 进行标识。核心特征逻辑隔离不同 Consumer Group 之间互不影响可以独立消费相同的消息水平扩展可以通过增加消费者数量提升消费能力高可用单个消费者宕机后其分区会被自动分配给组内其他消费者消费进度管理Kafka 自动维护每个 Group 在不同分区上的消费偏移量OffsetConsumer Group 的核心作用1. 实现发布-订阅模式多个 Consumer Group 可以同时订阅同一个 Topic每个 Group 都能获取到全量消息类似于广播机制。2. 实现消息队列模式在同一个 Consumer Group 内部每条消息只会被一个消费者实例处理确保消息不被重复消费。3. 消费能力的水平扩展通过增加 Consumer Group 中的消费者数量可以并行处理更多消息提升整体消费吞吐量。4. 故障自动转移当 Group 中某个消费者宕机时其负责的分区会被重新分配给其他活跃消费者实现高可用。Consumer Group 的工作原理核心组件Group Coordinator负责管理 Consumer Group 的组件运行在 Kafka Broker 上Group Leader消费者组中的领导者负责制定分区分配方案Consumer具体的消费者实例负责消费消息工作流程是否消费者启动向Group Coordinator发送JoinGroup请求选举Group LeaderGroup Leader获取所有消费者信息Leader制定分区分配方案Leader通过SyncGroup发送分配方案Group Coordinator广播分配结果所有消费者开始消费指定分区定期发送心跳保持连接检测到消费者变动?分区分配策略Kafka 提供了三种内置的分区分配策略1. Range 分配策略默认基于每个主题的范围进行分配将连续的分区分配给同一个消费者。示例主题 T1 有 8 个分区0-7Group 中有 3 个消费者C1、C2、C3C1分区 0,1,2C2分区 3,4,5C3分区 6,72. RoundRobin 分配策略将所有主题的分区视为一个整体轮询分配给消费者。示例主题 T1(0-3)、T2(0-3)消费者 C1、C2C1T1-0, T1-2, T2-0, T2-2C2T1-1, T1-3, T2-1, T2-33. Sticky 分配策略尽可能保持现有的分区分配只在需要重新分配时进行最小化的调整减少分区移动。// 配置分区分配策略示例props.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,Arrays.asList(RoundRobinAssignor.class.getName()));分区与消费者的关系Consumer Group 中最核心的设计是分区与消费者的绑定关系一个分区只能被 Group 中的一个消费者消费一个消费者可以消费多个分区当消费者数量 分区数时多余的消费者会处于空闲状态Consumer-GroupTopic-A分区0分区1分区2分区3消费者1消费者2消费者3消费者加入和离开 Group 的过程消费者加入 GroupJoinGroup消费者向 Group Coordinator 发送 JoinGroup 请求Coordinator 从所有消费者中选举一个作为 LeaderLeader 根据分配策略生成分区分配方案所有消费者通过 SyncGroup 请求获取分配结果消费者离开 GroupLeaveGroup当消费者主动关闭或超时未发送心跳时会触发 RebalanceCoordinator 检测到消费者离开标记该消费者为死亡状态触发新一轮 Rebalance剩余消费者重新分配该消费者的分区消费位移Offset管理Consumer Group 通过消费位移来记录消费进度自动提交默认// 自动提交配置props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,true);props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,1000);手动提交// 手动提交配置props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,false);// 同步提交consumer.commitSync();// 异步提交consumer.commitAsync(newOffsetCommitCallback(){OverridepublicvoidonComplete(MapTopicPartition,OffsetAndMetadataoffsets,Exceptionexception){if(exception!null){System.err.println(提交失败exception.getMessage());}}});实战代码示例创建 Consumer Group 的消费者publicclassKafkaConsumerExample{publicstaticvoidmain(String[]args){// 配置消费者参数PropertiespropsnewProperties();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,localhost:9092);props.put(ConsumerConfig.GROUP_ID_CONFIG,my-consumer-group);// 指定 Group IDprops.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName());props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName());props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,earliest);props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,false);// 创建消费者KafkaConsumerString,StringconsumernewKafkaConsumer(props);// 订阅主题consumer.subscribe(Arrays.asList(test-topic));try{while(true){// 拉取消息ConsumerRecordsString,Stringrecordsconsumer.poll(Duration.ofMillis(1000));for(ConsumerRecordString,Stringrecord:records){System.out.printf(partition %d, offset %d, key %s, value %s%n,record.partition(),record.offset(),record.key(),record.value());}// 手动提交位移consumer.commitSync();}}finally{consumer.close();}}}查看 Consumer Group 状态使用 Kafka 命令行工具# 查看所有消费者组bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092--list# 查看指定组的详细信息bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092\--groupmy-consumer-group--describe输出示例GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG my-group test-topic 0 15 20 5 my-group test-topic 1 12 12 0 my-group test-topic 2 8 18 10最佳实践建议1. 合理设置消费者数量消费者数量 ≤ 分区总数避免资源浪费根据消息处理耗时和吞吐量需求调整2. 选择合适的提交方式自动提交适合消息处理逻辑简单、允许少量重复的场景手动提交适合需要精确控制、保证 exactly-once 的场景3. 监控 Consumer Group 状态关注消费 Lag堆积量监控 Rebalance 频率设置合理的会话超时时间4. 处理 Rebalance 监听器consumer.subscribe(Arrays.asList(test-topic),newConsumerRebalanceListener(){OverridepublicvoidonPartitionsRevoked(CollectionTopicPartitionpartitions){// 在分区被回收前提交位移consumer.commitSync();}OverridepublicvoidonPartitionsAssigned(CollectionTopicPartitionpartitions){// 新分区分配后的处理System.out.println(获得新分区partitions);}});总结Consumer Group 是 Kafka 实现高吞吐、高可用的关键机制。它通过分区与消费者的绑定实现并行消费Rebalance 机制实现故障转移位移管理实现消费进度持久化理解 Consumer Group 的工作原理对于设计高性能的 Kafka 应用、排查消费问题、优化消费性能都至关重要。希望本文能帮助读者深入掌握这一核心概念。思考题如果 Consumer Group 中有 5 个消费者但只订阅了有 3 个分区的 Topic会发生什么如何优化这种情况欢迎在评论区讨论The End点点关注收藏不迷路

相关文章:

Kafka Consumer Group 详解:原理、机制与应用实践

Kafka Consumer Group 详解:原理、机制与应用实践前言什么是 Consumer Group?核心特征Consumer Group 的核心作用1. 实现发布-订阅模式2. 实现消息队列模式3. 消费能力的水平扩展4. 故障自动转移Consumer Group 的工作原理核心组件工作流程分区分配策略1…...

【C++编程】类和对象(一)---(类的初识引入以及定义 | 类的访问限定符及封装特性 | 类的作用域 | 类的实例化以及类对象模型 | this指针)

目录 前言 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式 7.3 结构体内存对齐规则 八、this指针…...

EgoScale:利用多样化的自我为中心人类数据来扩展灵巧操作

26年2月来自NV、UC Berkeley和U Maryland的论文“EgoScale: Scaling Dexterous Manipulation with Diverse Egocentric Human Data”。 人类行为是学习物理智能最具可扩展性的数据来​​源之一,但如何有效地利用这些数据进行灵巧操作训练仍不明确。虽然以往的研究已…...

FreeRTOS的队列介绍以及怎么实现互斥访问,休眠唤醒以及保存数据(环形缓冲区)

前言前面介绍完了FreeRTOS的一些核心功能,如任务切换,创建任务等等,并将煮包从ARM内核以及内存的视角的相关思考进行了分享,从这里开始介绍FreeRTOS的另外一个板块,就是任务间通信机制,如队列、信号量、互斥…...

豆包 LintCode 2798 · Aop 简化日志

你想要解决的是 LintCode 2798 这个关于使用 AOP(面向切面编程)简化日志记录的问题,核心需求应该是通过 AOP 的方式,在不侵入业务代码的前提下,为方法添加统一的日志记录功能。 问题分析与实现思路 AOP 的核心思想是横切关注点,日志记录就是典型的横切关注点。我们可以…...

Arduino 第一部分

一.Arduino IDE界面和设置1.选择开发板型号和端口(1)首先将开发板通过USB线连接到电脑上。需要注意的是,USB线需要插牢,有时候USB线未插牢,开发板上的灯也会亮(2)选择开发板型号①可以通过上方的…...

一键脚本安装OpenClaw时遇到问题怎么办?

在使用一键脚本安装 OpenClaw 时遇到问题,核心解决思路是先定位报错类型,再按 “基础排查→针对性修复→替代方案” 的顺序解决,下面我会把新手最常遇到的问题、原因和具体解决方法都列出来,你可以对照排查。 一、先做 3 步基础排…...

OpenClaw + Google Chrome(deb)+ WSLg:可视化浏览器自动化与人工接管教程

目标:在 WSL2 Ubuntu WSLg 环境中,使用 OpenClaw 控制 Linux 浏览器 GUI(非无头),实现自动登录/浏览网页/操作网页,并在遇到验证码(扫码、滑块、人机验证)时支持人工直接接管浏览器…...

豆包 LeetCode 679.24点游戏 public boolean judgePoint24(int[] cards)

这题是经典回溯 四则运算枚举,直接给你能提交的 Java 代码。 思路 1. 把数组转成 double 列表,避免整数除法问题。 2. 每次任选两个数,做 - * / 六种运算: ab, a*b(交换律,只算一次)a-b, …...

python flask django网络在线选课成绩管理系统

目录系统架构设计数据库模型设计核心功能模块成绩管理模块系统安全措施部署方案测试计划开发路线图项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用前后端分离架构,前端使…...

AAAI 2026 即插即用 | Transformer篇 | DHOGSA:新型自注意力!HOG先验引导特征精准聚焦边缘,PSNR猛涨!

VX: shixiaodayyds,备注【即插即用】,添加即插即用模块交流群。 文章目录 模块出处 模块介绍 模块提出的动机(Motivation) 适用范围与模块效果 模块代码及使用方式 模块出处 Paper:Gradient as Conditions: Rethinking HOG for All-in-one Image Restoration Code:https…...

【C++初阶】:C++入门相关知识(3):引用 inline内联函数 nullptr相关概念

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》《鼠鼠的C学习之路》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 前言:在上一篇文章中,我们学习了C的输入输出,缺省…...

C++继承、重载、多态相关问题(简单但通俗易懂)

第九章 组合与继承 一、比较 is-a 关系和 is-like-a 关系 1 is-a 关系 表示严格的继承关系。 含义:派生类是基类的一种特殊类型。例如: Dog is a Animal代码: class Animal{}; class Dog : public Animal{};特点: 派生类对象 可以…...

(其他)C1/C2驾照教程

目录1 科目二1.0 开车前检查1.1 倒车入库1.1.1 右倒库注意事项1.1.2 左倒库注意事项1.2 曲线行驶1.3 直角转弯1.4 侧方停车1.5 半坡起步1 科目二 本文介绍科目二的四个项目:倒车入库、曲线行驶、直角转弯、侧方停车。 1.0 开车前检查 调整座椅到合适的位置&#…...

[工具] 影子去除工具,可以批量去除影子,自动裁切透明,自动更新偏移坐标

影子去除工具,可以批量去除影子,自动裁切透明,自动更新偏移坐标一款专业的图片阴影去除工具,能够智能识别并去除图片中的阴影,还原物体真实颜色,广泛应用于照片修复、产品图处理、文档扫描优化等场景。 ##…...

代码随想录算法训练营day15| 110.平衡二叉树 (优先掌握递归)、 257. 二叉树的所有路径 (优先掌握递归)、 404.左叶子之和 (优先掌握递归)、 222.完全二叉树的节点个数(优先掌握

一、110.平衡二叉树 (优先掌握递归) 题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 初见思路: 学习代码随想录之后:平衡二叉树:左右子…...

leetcode 1409. 查询带键的排列

Problem: 1409. 查询带键的排列 考虑到实际模拟的话太耗费时间了&#xff0c;所以用哈希表来表示 数字-索引&#xff0c;然后对每个查询&#xff0c;拿到相应数字对应的索引ind&#xff0c;并且修改在索引ind前面的数字的索引都1 Code class Solution { public:vector<int…...

一次线上事故,我学到了事件驱动架构的5个教训

凌晨3点17分&#xff0c;监控大屏突然一片血红。用户订单"成功"了&#xff0c;但库存没扣、支付没扣、物流没发...上百万的交易数据人间蒸发。排查结果让所有人傻眼&#xff1a;只是一个"无关紧要"的代码改动&#xff0c;让整个事件驱动系统安静地"死…...

JetBrains IDEs官宣 实验性 AI 功能:Recap 与 Insights 详解

前言 JetBrains IDEs 已经提供了丰富的 AI 功能&#xff0c;从代码自动补全到代码生成和解释。2026年3月&#xff0c;JetBrains 推出了两款主动式 AI 功能实验插件——Recap&#xff08;回顾&#xff09;和Insights&#xff08;洞察&#xff09;&#xff0c;为开发者带来全新的…...

【靶点筛选样本前处理①】细胞膜蛋白的全流程提取实操:标准化制备及验证

引言 在多组学与空间蛋白质组学研究中&#xff0c;依赖全细胞裂解液的蛋白分析范式已显现显著局限 —— 其不仅会稀释低丰度亚细胞定位蛋白&#xff0c;还会完全掩盖细胞内蛋白转位事件&#xff0c;高纯度的细胞亚组分提取&#xff0c;已成为Western Blot、免疫共沉淀&#xf…...

老码农和你一起学AI系列:语言模型采样方法

语言模型在生成文本时&#xff0c;每一步都会计算出下一个词的概率分布&#xff08;比如“吃”&#xff1a;0.4&#xff0c;“喝”&#xff1a;0.3&#xff0c;“玩”&#xff1a;0.2……&#xff09;。那么&#xff0c;具体选哪个词作为输出呢&#xff1f;这就涉及采样方法。根…...

CSDN一亿技术人员的千载难逢机遇:个人如何转型,平台如何进化

CSDN一亿技术人员的千载难逢机遇&#xff1a;个人如何转型&#xff0c;平台如何进化 2026年&#xff0c;中国技术圈正在经历一场前所未有的范式转移。 这不是一次技术迭代&#xff0c;不是一次框架升级&#xff0c;不是一次语言更替——而是一次权力结构的根本性重构。 当大…...

SRMAS工作室简介

小红书、抖音 搜‘科研连连看’ ‘srmas工作室’ SRMAS英文全称Smart Research Multi Agent System,是多智能体协作&#xff08;MAS&#xff09;驱动的专业生产力实验室.一 定位srmas工作室是一家专注于复杂逻辑自动化与多智能体协同的技术工作室。通过自研的可视化 Mul…...

经典2DMMORPG手游【石器时代H5内购版】服务端图文手工搭建教程

游戏截图搭建环境信息 系统&#xff1a;Centos 7.6 配置&#xff1a;2核4G内存 搭建资源获取 资源网站&#xff1a;www.woniuyxdj.cn 宝塔面板安装 通用自动安装命令 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O in…...

2026大专国际经济与贸易就业方向有哪些?

2026年企业对于国贸类岗位的描述越来越清晰。外贸业务、跟单、报关报检等传统岗位的需求持续存在&#xff0c;具备实务经验的求职者往往能获得更多的面试机会。与此同时&#xff0c;随着跨境电商和各类新业态的快速发展&#xff0c;涉及海外市场运营、数字营销等方向的新岗位也…...

越南《人工智能法》具体内容详解(附中越互译)

越南《人工智能法》(第134/2025/QH15号)于2025年12月10日由越南国会以90.70%的高赞成率表决通过,2026年3月1日正式生效,共8章35条,是东盟首部全面规范人工智能领域的专项法律。该法以“管理以促进发展”为核心方针,在风险管控与创新激励间寻求平衡,既借鉴国际惯例,又立…...

习题3.12 另类循环队列

习题3.12 另类循环队列分数 20作者 DS课程组单位 浙江大学如果用一个循环数组表示队列&#xff0c;并且只设队列头指针Front&#xff0c;不设尾指针Rear&#xff0c;而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。函数接口定义&#xff1a;bool AddQ(…...

springboot+vue预报名管理系统--毕业论文

目录系统设计与技术选型需求分析与功能模块数据库设计后端实现前端实现系统安全与优化测试与部署总结与展望项目技术支持源码LW获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统设计与技术选型 阐述SpringBoot和Vue的技术优势&#xff0c;说…...

【AI】大语言模型 (LLM) 产品的开发流程参考

&#x1f525;小龙报&#xff1a;个人主页 &#x1f3ac;作者简介&#xff1a;C研发&#xff0c;嵌入式&#xff0c;机器人等方向学习者 ❄️个人专栏&#xff1a;《AI》 ✨ 永远相信美好的事情即将发生 文章目录前言一、个人开发者的大语言模型 (LLM) 产品的开发流程参考1.1 准…...

网络协议红蓝对抗:从TCP重传到QUIC的可靠性战争

网络协议红蓝对抗&#xff1a;从TCP重传到QUIC的可靠性战争原创深度技术长文 | 14,200字 | 含6大协议栈剖析、5个网络故障实验、4段可复现抓包分析 本文以高强度红蓝对抗形式&#xff0c;深入网络协议栈最核心战场——可靠性机制。从TCP的超时重传、快速恢复&#xff0c;到HTTP…...