Kafka 漏消费和重复消费问题

Kafka 虽然是一个高可靠、高吞吐的消息系统,但如果使用不当,**“漏消费”“重复消费”**问题是非常容易发生的,尤其在业务系统中会造成数据丢失、重复写库等严重问题。

🎯 一句话理解:

Kafka 本身提供 “至多一次”、“至少一次” 和 “精确一次” 消费语义,
而漏消费和重复消费问题的根本,都是出在offset 的提交时机消费逻辑的幂等性 上。

✅ 一、什么是“漏消费”?

📌 定义:

消息已经被 Kafka 成功发送、存储,但消费端没有处理这个消息 ➜ 数据丢了

😱 常见原因:

原因解释
❌ 消费端宕机后 offset 已经提交offset 提交 早于 实际业务处理,程序崩了,消息还没处理,Kafka 以为处理了,就不再发了
❌ 没有提交 offset,重启后从更晚位置开始消费比如 Kafka 设置 auto.offset.reset=latest,重启时跳过中间数据
❌ 代码异常、消息被跳过比如 try/catch 没处理好,某些消息被 catch 后 silently skip 掉了
❌ 手动 seek 到错误位置人为调整 offset 导致跳过

✅ 如何避免漏消费?

方法操作建议
🕐 “先处理,再提交 offset”在消费逻辑 执行成功后再提交 offset(手动提交)
🧠 幂等写入逻辑业务处理要有“可重复执行能力”,即使重试也不会出错
⚙️ 设置 enable.auto.commit=false避免自动提交 offset 导致“假消费”
🧪 加日志 & 监控每次消费都打印 offset / partition / key,方便排查是否跳过

✅ 二、什么是“重复消费”?

📌 定义:

同一条 Kafka 消息被消费端 重复消费了多次(可能是程序重启、故障、重试导致),
在业务层面就可能导致“重复下单、重复写库、重复通知用户”等问题。

😱 常见原因:

原因解释
❌ 消费端处理成功但 offset 未提交,下次又拉一遍比如网络闪断、服务宕机、offset 提交代码没执行到
❌ 业务处理超时/失败,Kafka 自动重试Kafka 不知道你业务是否处理成功,offset 没提交前会一直重发
❌ 手动回滚/重新消费历史消息如:使用 --from-beginning,或者重置 offset

✅ 如何避免重复消费?

方法操作建议
✅ 业务逻辑保持幂等性比如用唯一 id 去重(数据库主键、Redis SETNX、状态表)
✅ 使用事务机制(数据库 / Kafka Exactly Once)如 Kafka 的事务生产 + 消费保证“精确一次”语义(需要代价较高)
✅ offset 和处理“放在一个原子操作中”比如使用“消费 ➜ 写库 ➜ 手动提交 offset”顺序控制
✅ 设置合理的 max.poll.records 和超时避免消息拉多处理不完,被重复投递

🎯 Kafka 消费语义快速对比

消费语义说明漏消费风险重复消费风险
至多一次(at most once)先提交 offset,再处理✅ 可能漏消费❌ 不重复
至少一次(at least once)先处理,再提交 offset❌ 不漏消费✅ 可能重复
精确一次(exactly once)Kafka + 下游系统一体事务❌ 不漏消费❌ 不重复(代价高)

在实际中,至少一次 + 幂等处理 是最推荐、最落地的做法 💡

🧠 实战建议:你该怎么设计避免问题?

模块最佳实践
KafkaConsumer 配置enable.auto.commit=false,自己控制提交
消费逻辑处理成功后再提交 offset(提交失败时记得记录日志)
业务处理幂等设计:如订单号唯一,消息去重标识
监控告警consumer lag 监控、offset 提交率、处理失败率监控

✅ 总结一句话:

Kafka 中“漏消费”通常是 offset 提交太早
“重复消费”则是 offset 提交太晚/失败 + 业务无幂等
你要做的是:消费逻辑成功后再提交 offset,业务处理幂等安全

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大模型深度学习】如何估算大模型需要的显存

一、模型参数量 参数量的单位 参数量指的是模型中所有权重和偏置的数量总和。在大模型中,参数量的单位通常以“百万”(M)或“亿”(B,也常说十亿)来表示。 百万(M):表示…

LeetCode算法题(Go语言实现)_32

题目 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的孪生节点&#xff0c;节点 1 是…

Linux makefile的一些语法

一、定义变量 1. 变量的基本语法 在 makefile 中&#xff0c;变量的定义和使用非常类似于编程语言中的变量。变量的定义格式&#xff08;最好不要写空格&#xff09;如下&#xff1a; VARIABLE_NAMEvalue 或者 VARIABLE_NAME:value 表示延迟赋值&#xff0c;变量的值在引…

CAN/FD CAN总线配置 最新详解 包含理论+实战(附带源码)

看前须知&#xff1a;本篇文章不会说太多理论性的内容&#xff08;重点在理论结合实践&#xff09;&#xff0c;顾及实操&#xff0c;应用&#xff0c;一切理论内容支撑都是为了后续实际操作进行铺垫&#xff0c;重点在于读者可以看完文章应用。&#xff08;也为节约读者时间&a…

木马学习记录

一句话木马是什么 一句话木马就是仅需要一行代码的木马&#xff0c;很简短且简单&#xff0c;木马的函数将会执行我们发送的命令 如何发送命令&#xff06;发送的命令如何执行? 有三种方式&#xff1a;GET&#xff0c;POST&#xff0c;COOKIE&#xff0c;一句话木马中用$_G…

Linux系统调用编程

一、进程和线程的概念 1.进程 进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的最小单元。 定义&#xff1a;进程是程序的一次执行实例&#xff0c;拥有独立的地址空间、资源&#xff08;如内存、文件描述符等&#xff09;和系…

PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展-pg_dirtyread pg_dirtyread 是 PostgreSQL 的一个特殊扩展&#xff0c;它允许读取已被删除但尚未被 VACUUM 清理的数据行&#xff0c;是数据恢复的重要工具。 原理&#xff1a; pg_dirtyread 通过直接访问表的…

花卉识别分类系统,Python/resnet18/pytorch

花卉识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 共五种花卉&#xff1a;雏菊&#xff0c;蒲公英&#xff0c;玫瑰&#xff0c;向日葵&#xff0c;郁金香 标价包含GUI源码、数据集…

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

C++数据排序( 附源码 )

一.冒泡排序 原理:自左向右依次遍历,若相邻两数顺序错误,则交换两数. 这样,每一轮结束后,最大/最小的数就会到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

MTK-GMS版本国内WIFI受限问题

MTK-GMS版本国内WIFI受限问题解决 文章目录 问题参考资料解决方案方案一 修改配置坑点 方案二 直接修改属性 问题 最近负责ROOM 产品&#xff0c;出现WIFI受限显示&#xff0c;但是网络是通畅的。 GMS 版本&#xff0c;在国外或者国内翻墙网络不会出现WIFI受限显示问题&#…

34、web前端开发之JavaScript(三)

十. DOM操作详解 1、DOM简介 文档对象模型&#xff08;DOM&#xff0c;Document Object Model&#xff09;是JavaScript与网页内容交互的接口。它将HTML文档表示为一种树状结构&#xff08;DOM树&#xff09;&#xff0c;其中每个节点代表文档的一部分&#xff08;例如元素、…