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

Kafka 消息重复 消息丢失:一文彻底搞懂

这是 Kafka 面试必问 + 生产必踩的核心问题,我用最清晰、最落地的方式讲透:为什么会丢消息/重复?怎么彻底解决?


一、先明确核心结论

Kafka 本身不保证绝对不丢、绝对不重复,它只保证 At-Least-Once(至少投递一次)

  • 至少投递一次 = 可能重复,不会丢失
  • 想要不重复 = 业务自己做幂等
  • 想要不丢失 = 配置 + 机制配合

第一部分:Kafka 消息丢失(3 个场景 + 解决方案)

消息丢失只会发生在 3 个环节:

  1. 生产者 → Broker
  2. Broker 自身
  3. Broker → 消费者

1. 生产者丢消息(最常见)

原因

生产者发送消息后没收到ACK,以为发送失败,却没重试,消息就丢了。
Kafka 默认是异步发送,不等待确认。

解决方案

# 必须等待所有副本同步成功才确认
acks=all# 发送失败无限重试(生产推荐)
retries=Integer.MAX_VALUE# 重试时保证消息顺序(重要)
max.in.flight.requests.per.connection=1# 开启生产者幂等(自动去重,防止重试导致重复)
enable.idempotence=true

2. Broker 丢消息

原因

  • 消息刚写入 PageCache,Broker 宕机 → 数据丢失
  • 副本没同步完,Leader 挂了 → 数据丢失

解决方案

# 主题必须至少 2 个副本
replication.factor=3# 至少 2 个副本同步成功才算写入成功
min.insync.replicas=2# 关闭异步刷盘,强制同步刷盘(生产不推荐,影响性能)
# log.flush.interval.messages=1
# log.flush.interval.ms=1000

最佳实践:不靠刷盘,靠多副本保证不丢。


3. 消费者丢消息(最容易踩坑)

原因

先提交偏移量,再处理消息 → 处理失败时,消息永远丢失。

解决方案

必须:先处理消息 → 成功后再提交偏移量

# 关闭自动提交
enable.auto.commit=false

消费逻辑:

while(true){拉取消息处理业务(入库/发请求)手动提交 offset
}

第二部分:Kafka 消息重复(3 个场景 + 解决方案)

重复比丢失更常见,无法完全避免,只能靠业务幂等解决。

重复的 3 个原因

  1. 生产者重试发送
  2. 消费者处理完没提交 offset 就宕机,重启后重复消费
  3. 重平衡(Rebalance)导致重复拉取

终极解决方案:业务幂等(唯一键去重)

方案 1:数据库唯一键(最简单)

  • 每条消息生成 唯一消息ID
  • 消费时:INSERT ON DUPLICATE KEY UPDATE

方案 2:分布式锁(Redis)

  • 消息ID 作为 key
  • 消费前加锁,消费后释放
  • 重复消息直接跳过

方案 3:Kafka 原生幂等 + 事务(精准一次)

# 生产者幂等
enable.idempotence=true# 生产者事务(跨分区有序)
transactional.id=order-123

注意:Kafka 事务只能保证 Kafka 内部不重复,无法保证业务不重复,最终还是要靠业务幂等


第三部分:终极配置(生产直接复制)

生产者(不丢 + 不重复)

acks=all
retries=2147483647
max.in.flight.requests.per.connection=1
enable.idempotence=true
linger.ms=5
batch.size=16384
compression.type=lz4

消费者(不丢 + 可控重复)

enable.auto.commit=false
auto.offset.reset=earliest
max.poll.records=500

Broker(不丢)

min.insync.replicas=2
unclean.leader.election.enable=false

第四部分:一句话总结

消息丢失怎么处理?

  1. 生产者:acks=all + 重试 + 幂等
  2. Broker:多副本 + ISR 最小副本数
  3. 消费者:关闭自动提交,先消费后提交

消息重复怎么处理?

Kafka 无法杜绝重复,业务必须做幂等

  • DB 唯一键
  • Redis 分布式锁
  • 状态机判断

总结

  1. 丢失:配置可彻底解决
  2. 重复:配置只能减少,必须业务幂等
  3. Kafka 最佳可靠性:生产者幂等 + 多副本 + 手动提交偏移量 + 业务幂等
http://www.jsqmd.com/news/482204/

相关文章:

  • 找个大家都不累的见面地点:从“最佳聚会点”聊聊算法里的中位数智慧
  • ffmpeg.wasm 是否支持海康加密的视频格式
  • 消息队列(MQ)深度解析:核心价值与实战场景
  • UG NX 通过几何属性确定面的类型
  • 2026年3月上海猫咪绝育,靠谱专家大盘点,狗狗隐睾绝育/猫咪腹腔镜绝育/狗狗耳道内窥镜检查,猫咪绝育医生找哪个 - 品牌推荐师
  • 基于Spring Boot的物流管理平台设计与实践
  • 2026年商旅人士必看:隐私安全充电宝选型指南与核心防护指标实测 - 品牌推荐
  • SCAU算法设计与分析—— 一般方法
  • 基于Spring Boot的图书馆座位预约系统设计与实践
  • 前台、后台均无法访问,页面提示“数据库连接异常,请检查配置”,无法读取任何数据
  • 2026年用户口碑优选美国移民公司推荐:五家机构服务体验与成功实践对比 - 品牌推荐
  • 2026年高净值家庭必看:美国移民公司选型指南与精准适配策略。 - 品牌推荐
  • 2026福州猫咪眼科专家推荐:眼睑内翻手术好手,猫咪眼睑内翻手术/眼科/狗狗绝育/狗狗眼睑外翻手术,猫咪眼科医生推荐 - 品牌推荐师
  • 网站提示“PHP版本过低,请升级至7.0及以上版本”问题|已解决
  • keepalived+nginx高可用
  • 比如前端用户选择了一个本地文件,还没有上传云存储,就要在前端进行预览播放,此时视频是moov 元数据在最后的,这种情况应该如何处理?
  • 别再手动整理文献了!6款免费AI一键生成综述带真实交叉引用 - 麟书学长
  • 【工程心法】拒绝 final_v3.zip!撕开单片机代码管理的遮羞布:基于 Git Submodule 与 CMake 构筑异构工程的绝对同步阵型
  • 打开网站显示Parse error: syntax error, unexpected as (T_AS)错误怎么办|已解决
  • 上海狗狗绝育医生口碑盘点:专业与爱心并存,狗狗体检/母猫腹腔镜绝育/狗狗隐睾绝育,狗狗绝育医生推荐排行榜 - 品牌推荐师
  • 分布式锁实战指南:Redis vs ZooKeeper,到底该怎么选?
  • Android开发告别findViewById!DataBinding从入门到实战,一篇吃透
  • 微信小程序开发多少钱?3种开发方式详解+选择指南
  • 为什么大厂纷纷禁止SpringBoot用Tomcat?不是不好用,是真扛不住!
  • 基于SpringBoot前后端分离的宠物服务平台设计与实现
  • 基于SpringBoot和Vue的新能源汽车租赁管理系统设计与实现
  • Windows系列---【使用RAM Disk软件把内存虚拟成临时文件存储硬盘】
  • 【爬虫JS逆向之旅】某9安全中心登录参数逆向 - 1(验证接口篇)
  • 大数据领域Doris在农业科技领域的作物生长数据分析
  • 基于SpringBoot和Vue的校园二手书交易系统设计与实现