【kafka系列】Kafka如何保证消息不丢失?

目录

1. 生产者端:确保消息成功发送到Broker

核心机制:

关键步骤:

2. Broker端:持久化与副本同步

核心机制:

关键源码逻辑:

3. 消费者端:可靠消费与Offset提交

核心机制:

关键步骤:

4. 全链路保障流程

消息丢失的典型场景与规避

总结


  1. 生产者端
    • 设置acks=all确保所有ISR副本写入成功。
    • 启用重试(retries)和幂等性(enable.idempotence=true,依赖ProducerIdSequenceNumber)。
  1. Broker端
    • 副本数replication.factor≥3,ISR最小副本数min.insync.replicas≥2
    • 使用flush机制定期刷盘(通过log.flush.interval.messages配置)。
  1. 消费者端
    • 手动提交Offset(enable.auto.commit=false),处理完消息后调用commitSync()

Kafka通过生产者端确认机制Broker端持久化与副本同步消费者端可靠消费三个核心环节保障消息不丢失。以下是具体实现机制与步骤:


1. 生产者端:确保消息成功发送到Broker

核心机制
  • acks确认机制
    • acks=0:生产者不等待Broker确认,可能丢失消息(不推荐)。
    • acks=1:Leader副本写入即确认,若Leader宕机且未同步到其他副本,可能丢失。
    • acks=all(或acks=-1:必须等待所有ISR副本写入成功,才返回确认(最高可靠性)。
  • 重试机制
    • 配置retries=N(如3次),在Broker临时故障时自动重试。
    • 幂等性(enable.idempotence=true):通过Producer IDSequence Number去重,避免网络重试导致消息重复。
关键步骤
// 生产者配置示例
Properties props = new Properties();
props.put("acks", "all");          // 必须所有ISR副本确认
props.put("retries", 3);           // 重试次数
props.put("enable.idempotence", "true"); // 开启幂等性

2. Broker端:持久化与副本同步

核心机制
  • 副本机制(Replication)
    • 每个Partition有多个副本(replication.factor≥3),Leader处理读写,Follower同步数据。
    • ISR(In-Sync Replicas):只有与Leader保持同步的副本才属于ISR集合。
    • min.insync.replicas=2:至少需要2个ISR副本写入成功,否则生产者抛出NotEnoughReplicasException
  • 持久化策略
    • 页缓存(Page Cache):依赖操作系统缓存加速写入,数据异步刷盘。
    • 强制刷盘:通过log.flush.interval.messageslog.flush.interval.ms控制刷盘频率(高可靠性场景建议启用)。
  • Leader选举与数据恢复
    • 若Leader宕机,Controller从ISR中选举新Leader,确保数据不丢失。
    • 若所有ISR副本宕机,需配置unclean.leader.election.enable=false(禁止非ISR副本成为Leader)。
关键源码逻辑
  • 副本同步:Leader通过ReplicaFetcherThread向Follower同步数据(源码见kafka.server.ReplicaFetcherThread)。
  • ISR管理:Broker定期检查Follower的同步状态,延迟超过replica.lag.time.max.ms的副本会被移出ISR。

3. 消费者端:可靠消费与Offset提交

核心机制
  • 手动提交Offset
    • 关闭自动提交enable.auto.commit=false),在消息处理完成后手动调用commitSync()commitAsync()
    • 若消费者崩溃,下次启动时从最后提交的Offset恢复,避免消息丢失。
  • 事务性消费
    • 结合Kafka事务(isolation.level=read_committed),仅消费已提交的事务消息。
关键步骤
// 消费者配置示例
props.put("enable.auto.commit", "false"); // 关闭自动提交
while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {processRecord(record); // 处理消息consumer.commitSync(); // 处理完成后提交Offset}
}

4. 全链路保障流程

  1. 生产者发送
    • 消息发送后等待acks=all确认。
    • 若Broker未确认,按retries重试。
  1. Broker持久化
    • Leader和ISR副本将消息写入日志文件。
    • 根据配置决定是否强制刷盘。
  1. 消费者消费
    • 处理消息后手动提交Offset。
    • 若消费者崩溃,从已提交Offset恢复。

消息丢失的典型场景与规避

场景

规避措施

生产者acks=1

,Leader宕机

使用acks=all

+ min.insync.replicas=2

ISR副本不足导致写入失败

增加replication.factor

,确保min.insync.replicas

≤ 当前ISR副本数。

消费者自动提交Offset,消息未处理

关闭自动提交,处理完成后手动提交。

磁盘故障导致数据丢失

使用RAID或分布式存储,确保多副本分布在不同物理节点。


总结

Kafka通过以下组合策略保障消息不丢失:

  1. 生产者端acks=all + 幂等性 + 重试。
  2. Broker端:多副本同步 + ISR管理 + 强制刷盘。
  3. 消费者端:手动提交Offset + 事务性消费。

正确配置后,Kafka可提供至少一次(At-Least-Once)或精确一次(Exactly-Once) 的语义保障。

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

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

相关文章

使用Python爬虫实时监控行业新闻案例

目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代&#xff0c;新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链&#xff0c;今天讲一下Shiro的反序列化利用&#xff0c;这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化&#xff0c;之前也是讲过的&#xff0c;打开我们写过的serialization_demo。代码也很简单&…

DeepSeek 助力 Vue 开发:打造丝滑的无限滚动(Infinite Scroll)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

计算机视觉:卷积神经网络(CNN)基本概念(二)

接上一篇《计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一)》 二、图像特征 三、什么是卷积神经网络&#xff1f; 四、什么是灰度图像、灰度值&#xff1f; 灰度图像是只包含亮度信息的图像&#xff0c;没有颜色信息。灰度值&#xff08;Gray Value&#xff09;是指图…

vscode/cursor 写注释时候出现框框解决办法

一、问题描述 用vscode/cursor写注释出现如图的框框&#xff0c;看着十分难受&#xff0c;用pycharm就没有 二、解决办法 以下两种&#xff0c;哪个好用改那个 &#xff08;1&#xff09;Unicode Highlight:Ambiguous Characters Unicode Highlight:Ambiguous Characters &a…

【2.10-2.16学习周报】

文章目录 摘要Abstract一、理论方法介绍1.模糊类增量学习2.Rainbow Memory(RM)2.1多样性感知内存更新2.2通过数据增强增强样本多样性(DA) 二、实验1.实验概况2.RM核心代码3.实验结果 总结 摘要 本博客概述了文章《Rainbow Memory: Continual Learning with a Memory of Divers…

ABP - 事件总线之分布式事件总线

ABP - 事件总线之分布式事件总线 1. 分布式事件总线的集成1.2 基于 RabbitMQ 的分布式事件总线 2. 分布式事件总线的使用2.1 发布2.2 订阅2.3 事务和异常处理 3. 自己扩展的分布式事件总线实现 事件总线可以实现代码逻辑的解耦&#xff0c;使代码模块之间功能职责更清晰。而分布…

Zotero7 从下载到安装

Zotero7 从下载到安装 目录 Zotero7 从下载到安装下载UPDATE2025.2.16 解决翻译api异常的问题 下载 首先贴一下可用的链接 github官方仓库&#xff1a;https://github.com/zotero/zotero中文社区&#xff1a;https://zotero-chinese.com/官网下载页&#xff1a;https://www.z…

typecho快速发布文章

typecho_Pytools typecho_Pytools工具由python编写&#xff0c;可以快速批量的在本地发布文章&#xff0c;不需要登陆后台粘贴md文件内容&#xff0c;同时此工具还能查看最新的评论消息。… 开源地址: GitHub Gitee 使用教学&#xff1a;B站 一、主要功能 所有操作不用登陆博…

Redis7——基础篇(一)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09; 一、Redis定义 官网地址&#xff1a;Redis - The Real-time Data Platform R…

K8s组件

一、Kubernetes 集群架构组件 K8S 是属于主从设备模型&#xff08;Master-Slave 架构&#xff09;&#xff0c;即有 Master 节点负责集群的调度、管理和运维&#xff0c;Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点&#xff0c;master节点上有 apis…

草图绘制技巧

1、点击菜单栏文件–》新建–》左下角高级新手切换–》零件&#xff1b; 2、槽口&#xff1a;直槽口&#xff0c;中心点槽口&#xff0c;三点源槽口&#xff0c;中心点圆弧槽口&#xff1b; 3、草图的约束&#xff1a;需要按住ctrl键&#xff0c;选中两个草图&#xff0c;然后…

一款基于若依的wms系统

Wms-Ruoyi-仓库库存管理 若依wms是一套基于若依的wms仓库管理系统&#xff0c;支持lodop和网页打印入库单、出库单。毫无保留给个人及企业免费使用。 前端采用Vue、Element UI。后端采用Spring Boot、Spring Security、Redis & Jwt。权限认证使用Jwt&#xff0c;支持多终…

AWS transit gateway 的作用

说白了,就是根据需要,来起到桥梁的作用,内部沟通,或者面向internet. 先看一下diagram 图: 最中间的就是transit gateway, 要达到不同vpc 直接通讯的目的: The following is an example of a default transit gateway route table for the attachments shown in the previ…

把 CSV 文件摄入到 Elasticsearch 中 - CSVES

在我们之前的很多文章里&#xff0c;我有讲到这个话题。在今天的文章中&#xff0c;我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…

[操作系统] 基础 IO:理解“文件”与 C 接口

在 Linux 操作系统中&#xff0c;“一切皆文件”这一哲学思想贯穿始终。从基础 IO 学习角度来看&#xff0c;理解“文件”不仅仅意味着了解磁盘上存储的数据&#xff0c;还包括对内核如何管理各种资源的认识。本文将从狭义与广义两个层面对“文件”进行解读&#xff0c;归纳文件…

国产编辑器EverEdit - 二进制模式下观察Window/Linux/MacOs换行符差异

1 换行符格式 1.1 应用场景 稍微了解计算机历史的人都知道&#xff0c; 计算机3大操作系统&#xff1a; Windows、Linux/Unix、MacOS&#xff0c;这3大系统对文本换行的定义各不相同&#xff0c;且互不相让&#xff0c;导致在文件的兼容性方面存在一些问题&#xff0c;比如它们…

设计模式Python版 命令模式(下)

文章目录 前言一、命令队列的实现二、撤销操作的实现三、请求日志四、宏命令 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…

Linux:进程概念详解

​ 进程概念详解 一、进程的基本概念 进程在书本上的定义是&#xff1a;计算机中正在运行的程序实例。仅此描述可能让很多人感到困惑。 我们磁盘上存储着.exe文件&#xff0c;启动文件时&#xff0c;文件会从磁盘加载到内存&#xff0c;由CPU对文件的数据和代码进行运算。但…

04性能监控与调优篇(D1_学习前言)

目录 一、引言 二、基本介绍 三、JVM基础 1. java堆 2. 垃圾回收 3. STW 四、调优层次 五、调优指标 六、JVM调优原则 1. 优先原则 2. 堆设置 3. 垃圾回收器设置 1> GC 发展阶段 2> G1的适用场景 3> 其他收集器适⽤场景 4. 年轻代设置 5. 年⽼代设置 …