别再乱排查了!Kafka 消息积压、重复、丢失,根源基本都是 Rebalance!

news/2025/10/16 14:36:29/文章来源:https://www.cnblogs.com/chengxy-nds/p/19145578

大家好,我是小富~

有次上线监控告警突然炸了,Kafka 订单 Topic 消息积压量突破 10 万条,下游支付服务拿不到数据,部分用户付款后一直显示处理中。

紧急登录集群排查,发现消费者组明明有 3 个节点,却只有 1 个在正常消费,原来 10 分钟前触发了 Rebalance,另外两个节点还卡在分区重新分配的状态,导致消费能力直接砍半。

所以我的经验是:Kafka出现消息积压、重复、丢失这类问题,直接看是否有Rebalance,能解决大部分问题。

什么时候会触发 Rebalance?

Rebalance 本质是消费者组内分区与消费者的重新分配,只有当消费者、分区的对应关系被打破时才会触发,下边咱们看看几种比较常见的场景:

1. 消费者数量变了(最频繁)

扩容触发:业务高峰时加了消费者节点,比如 3 个分区原本 2 个消费者承担,新增 1 个后,需要重新分配成 1 个消费者对应 1 个分区;

下线触发:消费者节点宕机、网络断连,或进程被误杀,比如 3 个消费者少了 1 个,剩下 2 个要接手它的分区,必然触发 Rebalance。

之前我们的日志服务就踩过坑:K8s 节点资源不足,导致消费者 Pod 频繁重启,每重启一次就触发一次 Rebalance,消息积压越来越严重。

2. Topic 分区数加了

Kafka 不支持减少分区,但新增分区时,已存在的消费者组不会自动感知新分区,必须通过 Rebalance,才能把新分区分配给组内消费者。

比如给 order-topic 从 5 个分区扩到 8 个,原本的消费者组只会消费旧的 5 个分区,直到触发 Rebalance 后,才会接手新增的 3 个分区。

3. 订阅的 Topic 变了

消费者组通过 subscribe() 订阅 Topic 时,若修改订阅列表(比如从只订阅 order-topic,改成同时订阅 order-topicpay-topic),会触发 Rebalance,重新分配所有订阅 Topic 的分区。

4. 心跳或消费超时(隐性坑)

消费者靠心跳向 Coordinator(协调者)证明自己活着,这两个超时参数设不好,很容易触发误判式 Rebalance:

心跳超时:消费者每 3 秒(默认 heartbeat.interval.ms)发一次心跳,超过 45 秒(默认 session.timeout.ms)没发,就被判定死亡;

消费超时:处理单批消息超过 5 分钟(默认 max.poll.interval.ms),哪怕心跳正常,也会被强制踢出组,触发 Rebalance。

我们之前处理大订单消息时,单条消息处理要 6 分钟,直接触发消费超时,导致 Rebalance 频繁发生。

Rebalance 引起哪些问题

Rebalance 不是瞬间完成的,整个过程要经历注销旧分区→选举 Leader→分配新分区→消费者初始化,期间对业务的影响比你想的大。

1. 消费暂停,消息积压

Rebalance 期间,所有消费者都会暂停消费,等待新的分区分配。如果消费者组规模大(比如 100 个消费者、1000 个分区),Rebalance 可能持续几十秒,这段时间 Topic 消息只会堆积,下游服务拿不到数据。

所以在有消息积压的情况,优先看看是否有 Rebalance 的情况。

2. 消息重复和消息丢失

Rebalance 后,消费者重新拿到分区时,消费进度可能倒退:若没及时提交 offset(不管自动还是手动),会从最后一次提交的 offset 开始消费,中间没提交的消息要么重复处理,要么直接跳过,也就是消息重复消费和消息丢失的原因。

极端情况(比如 Coordinator 宕机),offset 存储的分区发生主从切换,可能导致 offset 数据错乱,进度直接回到几天前。

3. 资源浪费,负载不均

Rebalance 要靠 Coordinator 协调,频繁触发会占用 Kafka 集群的 CPU 和网络资源;而且 Kafka 默认的分区分配策略(Range 或 RoundRobin),很容易导致负载不均。

比如 5 个分区分配给 2 个消费者,可能出现 3 个分区 vs 2 个分区的情况,其中一个消费者压力翻倍,处理速度变慢,又会触发新的 Rebalance,陷入恶性循环。

什么情况下会丢数据

Rebalance 本身不会直接丢数据,但结合offset 提交和处理逻辑,很容易出现消息漏消费。

1.自动提交 offset + 消费没完成

Kafka 默认自动提交 offset,提交时机是 poll 到消息后,等 5 秒(默认 auto.commit.interval.ms)自动提交。如果刚提交完 offset,消息还没处理完就触发 Rebalance,新消费者会从已提交的 offset 之后 开始消费,中间没处理的消息就丢了。

举个例子:

  • 消费者 A poll 到 offset 100-200 的消息,5 秒后自动提交 offset 200;

  • 处理到 150 条时,节点突然宕机,触发 Rebalance;

  • 新消费者 B 从 offset 200 开始消费,offset 150-199 的消息直接丢失。

2. 手动提交 offset 时机错了

手动提交时,如果把提交 offset 放在处理消息之前,也会丢数据。

  • 错误逻辑:先提交 offset → 再处理消息;

  • 风险:提交后、处理前触发 Rebalance,新消费者会跳过已提交的消息,导致未处理的消息丢失。

正确的做法应该是先处理消息→再提交 offset,确保消息处理完才更新进度。

什么情况下会重复消费?

相比丢数据,kafka Rebalance 导致的重复消费更普遍,核心原因都是 offset 提交滞后于消息处理。

1. 手动提交时,Rebalance 打断了提交

开启手动提交后,若在处理完消息→提交 offset 的间隙触发 Rebalance,offset 没提交成功,新消费者会从上次提交的位置重新消费。

  • 消费者 A 处理完 offset 100-200 的消息,准备提交时,因心跳超时被踢出组;

  • 新消费者 B 从 offset 100 开始消费,导致 100-200 的消息被重复处理。

2. 消费超时被踢,消息还在处理

处理消息耗时超过 max.poll.interval.ms,消费者被判定死亡,但实际还在处理消息。

  • 消费者 A 处理大消息用了 6 分钟,超过默认 5 分钟的超时时间,被踢出组;

  • 新消费者 B 接手分区,从上次提交的 offset 开始消费;

  • 消费者 A 后来处理完消息,想提交 offset 却发现自己已被踢出,提交失败,导致消息重复。

3. offset 找不到,回退到最早

如果消费者组的 auto.offset.reset 设为 earliest(默认是 latest),Rebalance 后找不到已提交的 offset(比如 offset 数据损坏),会从 Topic 最早的消息开始消费,导致历史消息重复。

如何优化 Rebalance

Rebalance 这种情况是无法完全避免,不过我们可以来优化,能把影响降到最低。

1. 避免频繁触发 Rebalance

调优超时参数:根据消息处理耗时,把 max.poll.interval.ms 设大(比如大消息设为 10 分钟),session.timeout.ms 设为 60-120 秒,避免误判死亡;

保证消费者稳定:用监控盯紧消费者节点的 CPU、内存,避免 K8s Pod 频繁重启,或服务器宕机。

2. 安全处理 offset 提交

优先手动提交,关闭自动提交(enable.auto.commit=false),在消息处理完成后再调用 commitSync() 提交;

必要时用事务,如果业务不允许重复消费,结合 Kafka 事务,确保消息处理 和 offset 提交原子性。

3. 优化分区分配

选粘性分配策略:把 partition.assignment.strategy 设为 StickyAssignor,Rebalance 时尽量保留原有分配,减少分区变动。

4. 优化消费逻辑

做好幂等性:比如用订单 ID 作为唯一键,即使重复消费,也不会导致业务逻辑出错(比如重复扣钱、重复生成订单)。

写在最后

Rebalance 是面试的时候常爱问的场景题,它是 Kafka 消费者组的双刃剑,用好能均衡负载,用不好就会引发故障,最后我总结下:

  1. 触发 Rebalance 主要是消费者或分区变了或超时了;

  2. 丢数据和重复消费,本质是 offset 提交和 Rebalance 时机没配合好;

  3. 优化超时参数、手动提交 offset、做好幂等性,是减少影响的关键。

看完等于学会,点个赞吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年交通杯-爆破题wp

题目:解压就俩文件,就是要通过txt的历史密码推测出现在1.zip的新密码。history-pwd.txt内容为:之前的一般思路是错的,估计大部分的思路跟我们一开始一样。认为是Mysql、Nginx、Oracle、Tomcat、Weblogic等的组合。…

挖象浏览器下载安装教程|支持淘宝、拼多多、抖音多平台账号分区管理

挖象浏览器是一款专为电商行业打造的全能浏览器。它支持淘宝、拼多多、抖音、小红书、亚马逊等国内外主流电商平台,可实现多店铺账号的安全分区管理,提供独立稳定的IP,有效解决账号关联风险。挖象浏览器内置丰富的电…

2025 年国内活性炭回收交易公司最新推荐排行榜:实力厂商深度解析,助力企业精准选合作方回收果壳活性炭/回收煤质柱状活性炭/库存各种活性炭公司推荐

当前活性炭行业应用广泛,从自来水处理到工业污水净化、食品加工脱色等领域均有涉及,市场规模持续扩大。但行业内厂商数量繁杂,部分厂商存在原料把控不严、生产工艺落后导致产品质量不稳定,还有些厂商技术团队薄弱,…

2025-10-15 CSP-J 模拟赛 赛后总结【ZROI】

孩子们,我开了文件读写然后全爆 0 了!!!!!T1 吃 吃了吧。题意 给 \(a\) 和 \(b\) 两个序列,选定一个子串,对于子串的任意一个位置,都可以选择 \(a_i\) 或 \(b_i\) 其一,选定的连续子串合法当且仅当存在一种选…

辐射检测仪哪家好?CT剂量模体哪家好?

在核辐射监测、放射医疗、环保检测等领域,辐射检测仪的精准性与可靠性直接关系到安全防护与检测效率。面对市场上众多品牌,如何选择合适的厂商?本文结合产品性能、企业实力、资质认证等维度,为您推荐三家优质厂商,…

【2025-10-14】玩玩植物

20:00对人之爱,其目的是帮助人们成为他们所能成为之人。——卡尔雅思贝尔斯周日,我跟何太商量好借带二宝去看医生这事,顺便去逛逛本地最大的花鸟鱼虫市场。确实,整个看医生过程也就不到半小时。剩下的,就是我们一…

2025 木饰面源头厂家最新推荐榜单:21 年深耕企业领衔,背景墙 / 全屋 / 碳晶板 / 岩板全场景适配品牌解析

当前木饰面市场品类繁杂、品牌良莠不齐,采购方常陷入 “选品难、辨质难、适配难” 的三重困境。家装用户纠结环保性能与风格适配性,公装采购担忧产能不足与性能达标问题,中小订单则面临供货周期长、损耗率高的痛点。…

读书笔记:Oracle LOB类型:大数据存储的终极指南

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

2025 年铝塑板源头厂家最新推荐榜:聚焦气候适配与品质服务,西南及全国优质供应商精选,含门头 / 墙面 / 外墙等场景专款

2025 年建筑装饰行业对铝塑板的气候适配性、耐用性与服务效率要求持续升级,但市场仍存在 “选品难、辨质难” 的痛点:部分产品因原材料劣质导致防火与抗折性能不达标,通用型板材难以适配西南高海拔强紫外线等特殊气…

2025年散装物料输送设备厂家最新品牌推荐榜:刀闸阀/换向阀/旋转阀厂家权威甄选,核心竞争力深度解析!

在散装物料输送系统中,刀闸阀主要用于切断或接通物料流,特别适合处理高磨损性、粘性或含纤维的粉粒状物料,其锋利的闸板能有效防止堵塞;换向阀则用于改变物料的输送路径,实现从主管道向多个料仓或设备的灵活分配,…

【2025-10-13】平凡父母

20:00也许宇宙间最反直觉的真理是:你给予的越多,你得到的就越多。理解这一点,是智慧的开端。——凯文凯利今早起床时,何太摸了摸二宝的额头,发烧了。我立马给她测了一下体温,38.6度。难怪二宝大半夜一直在咿咿呀…

Oracle故障处理:轻松搞定ORA-01190报错

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle故障处…

【2025-10-15】农村自建房

20:00让你痛苦的不是别人,而是你的想法。——理查德S拉扎勒斯昨晚,老家要好的一位朋友,问我认不认识盖房子的本地包工头。后来得知,他想把他老家农村的空置宅基地给建了。但我挺好奇的,他本身就是做建筑相关行业,…

EAS_接口新增单据提示没有组织单据新增权限

二开的接口,新增的时候,提示么有组织的接口同步单据的新增权限,接口用户用A,在客户端给用户A分了权限后,发现并没有用,仔细检查代码,能够发现,在代码中,重新设置了接口的上下文,当单据提交时候,实际上是用该…

集成驱动安全:Synack如何通过技术整合提升安全效能

本文详细介绍了Synack渗透测试即服务平台如何通过与主流安全工具集成,帮助企业提升漏洞修复效率达63%,修补效能提升近20%,实现智能化的风险优先排序和自动化修复流程。效率与影响:Synack集成如何提升安全成果 “效…

测试编辑器功能:标题、列表、代码块。测试

测试编辑器功能:标题、列表、代码块。测试功能方面Markdown 编辑器:支持大部分 Markdown 语法,对于标题、列表、代码块的创建有特定的语法规则。例如,使用 “#”“##”“###” 等可以快速创建不同级别的标题;使用…

283.移动零

283.移动零Posted on 2025-10-16 14:08 lachesism 阅读(0) 评论(0) 收藏 举报给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地…

全自动红外测油仪厂家推荐/国产红外测油仪品牌推荐/靠谱供应商采购推荐

在环境监测、石油化工、污水处理等诸多领域,全自动红外测油仪作为检测水中石油类和动植物油含量的关键设备,其精准度与效率直接影响着水质评估与污染治理效果。天津众科创谱科技有限公司凭借深厚的技术积累、过硬的产…

洛谷P4516 [JSOI2018] 潜入行动

朴素的设计 \(DP\),\(dp_{i,j,0/1,0/1}\) 表示 \(i\) 的子树选了 \(j\) 个点,当前选没有,当前被覆盖没有。 令人火大的转移方程(具体转移边界还请看代码): \[\begin{align}&dp_{u,j,0,0} = \sum_{k=1}^{siz_…

Mysql1064,最常见的语法错误

MySQL 错误代码 1064 是最常见的语法错误,表示 SQL 语句存在语法问题,数据库无法解析。通常提示信息会包含具体错误位置(如 near ... at line N)。 常见原因及解决方法:SQL 语法错误(最常见) 拼写错误:关键字写…