Kafka 的数据丢失和重复消费

使用Kafka查询消费数据 在Kafka中,消息通过主题(Topic)进行发布和订阅,而消费者(Consumer)可以从主题中读取消息并进行处理。上述代码中,我们首先配置了Kafka消费者的属性,包括Kafka集群地址、消费者组ID以及键和值的反序列化器。然后,我们创建了一个Kafka消费者对象,并订阅了名为"test-topic"的主题。通过以上代码,你可以轻松地编写一个Kafka消费者,并从指定的主题中获取消息进行处理。如有任何疑问,请随时提问。例如,你可以订阅多个主题、设置不同的消费者属性以及实现自定义的消息处理逻辑。 阅读详情

1/ 生产端 Producer

 

消息格式:每个消息是一个 ProducerRecord 对象,必须指定消息所属的 Topic 和消息值 Value ,此外还可以指定消息所属的 Partition 以及消息的 Key。Producer 生产数据默认是先写到内存(PageCache)中的,定期 flush 到磁盘上。默认的这个参数是:

 

 

 

 

设置较小定期 flush 的时间,并不能真正保证数据不会丢失。通过查看官方提供的默认配置 Long.MaxValue 也可以看出,官方是不建议我们通过这个参数来改变什么的,也就是说设置 flush 的时间,不能从根本上保证我们的数据丢失问题。

 

前面一开始提到,kafka 作为一个可分区和可复制的消息队列。我们可以利用它的分区副本机制,为每一个 Topic 的数据分为多个分区,每个分区放在不同的节点上,每个分区默认只有一分数据,通过设置参数 --replication-factor 2 ,可以执行每个分区有三份数据,其中有两份是用来备份的。

 

分区有副本了,也会存在 leader 和 follower 的角色,zookeeper 中维护了一个 ISR 列表。

 

这时,生产者往 broker 中写入数据的时候,默认的消息确认级别是 request.required.acks = 0, 表示生产者发送消息之后,不会等待 leader的确认。

 

 

所以,需要把这个设置为 -1 ,表示生产者发送消息要等到 leader 以及所有的副本都同步了,才会返回确认消息。当然,这种方案也不是非常万无一失的,官方提出的建议是,还需要配置 min.insync.replicas 最小同步的副本数,如果没有得到这个最小数的要求,生产者会抛出异常,本次写入不会成功。比如,我有三个副本,那么最好找个参数要设置成 2 ,要保证大部分的副本同步了数据。

 

官方原文:

 

 

 

 

 

总结:request.required.acks = -1 虽然保证了数据的一致性,但是同时也影响了性能。在实际业务中应该考虑数据少量丢失对于业务的影响,要根据自己的情况来,结合业务来平衡数据一致性和系统的性能。

 

有兴趣的读者可以去研究一下 CAP, 分布式系统的三个指标,推荐阮一峰老师写的 -- CAP 定义的原理。

 

2/ 消费端 Consumer

 

消费端数据丢失的原因是 offset 的自动提交。

 

 

 

 

由于在使用kafka的高级API时,消费者会自动每隔一段时间将offset保存到zookeeper上,此时如果刚好将偏移量提交到zookeeper上后,但这条数据还没消费完,机器发生宕机,此时数据就丢失了。

 

解决方法:关闭自动提交,改成手动提交,每次数据处理完后,再提交。

 

数据重复消费,在消费者自动提交offset到zookeeper后,程序又消费了几条数据,但是还没有到下次自动提交offset到zookeeper之时,如果机器宕机了,然后重启,此时消费者会去读zookeeper上的偏移量进行消费,这就会导致数据重复消费。 解决方法:关闭自动提交,改成手动提交。

 

这里再提一下 kafka 的两种方式API,以供大家选择合适的。

 

高级 API 的特点

 

优点

● 高级API写起来简单

● 不需要去自行去管理offset,系统通过zookeeper自行管理

● 不需要管理分区,副本等情况,系统自动管理

● 消费者断线会自动根据上一次记录在 zookeeper中的offset去接着获取数据

缺点

● 不能自行控制 offset(对于某些特殊需求来说)

● 不能细化控制如分区、副本、zk 等

 

低级 API 的特点

 

优点

● 能够开发者自己控制offset,想从哪里读取就从哪里读取。

● 自行控制连接分区,对分区自定义进行负载均衡

● 对 zookeeper 的依赖性降低(如:offset 不一定非要靠 zk 存储,自行存储offset 即可,比如存在文件或者内存中)

缺点

● 太过复杂,需要自行控制 offset,连接哪个分区,找到分区 leader 等

 

本文就到这里,实际生产中需要结合自己的业务去选择。

【kafka专栏】消费偏移量4种提交方式以及如何避免消费数据丢失与重复消费 kafka消费者客户端,消费偏移量4种提交方式以及如何避免消费数据丢失与重复消费 阅读详情

相关推荐

实用工具抓取youtube热门数据

YouTube作为全球第二大搜索引擎,2024年日均视频播放量突破50亿次,头部创作者单月广告分成可达百万美元量级。但对数据分析者而言,其反爬机制堪称业界最严: ‌反爬技术升级‌:Google部署的Botguard系统可检测异常流量,触发机制包括: 单IP每小时请求超过50次即封禁 检测Headless浏览器指纹(如Chrome的navigator.webdriver属性) 动态加载内容(如评论数据需滚动页面3次后加载) ‌数据价值维度‌:某MCN机构研究显示,前100热门视频的标题关键词复用率高达67%

26万+

如何查看kafka消息消费进度以及是否有未消费的消息

查询是否有未消费的消息的方式有三种: 第一种,kafka自带命令 kafka的bin目录下,执行命令: kafka-consumer-groups.sh --bootstrap-server node1:9092 --describe --group mylcy 可以看到当前的消费进度(CURRENT-OFFSET)、消息进度(LOG-END-OFFSET)、落后量(LAG): 第二种:JAVA API public static Map<TopicPartition, Long> lag

epitomizelu的专栏 4万+

别再死磕DH参数了!用MATLAB Robotics Toolbox + SOLIDWORKS搞定六轴机械臂仿真(附避坑指南)

本文详细介绍了如何利用MATLAB Robotics Toolbox和SOLIDWORKS进行六轴机械臂仿真,避免常见的DH参数错误和模型导出问题。通过实战指南和避坑技巧,帮助工程师实现从三维建模到运动学仿真的无缝衔接,提升仿真效率和准确性。

weixin_27066963的博客 395

【kafka】服务器命令行查询kafka信息消费情况

kafka-tool出问题的情况下,可以用命令行来查看kafka信息

好学的小师弟的博客;华为云社区月度积极博主 1万+

electron windows设置镜像地址环境变量报错npm error `ELECTRON_MIRROR` is not a valid npm option

如果你是在使用某个特定的脚本或配置文件,请检查该文件中是否有不正确的配置项,并进行相应的修正。确保你遵循electron的官方安装指南,并且没有包含不必要的或错误的配置选项。如果问题依然存在,可以查看npm的官方文档或者相关社区获取更多帮助。

qq_36158551的博客 3326

【Simscape】用Simscape实现三维物理仿真(三)——创建一个滑块单摆系统

1 首先创建一个Simscape Multibody 模型 (方法见 【Simscape】用Simscape实现三维物理仿真(一)——创建一个自由落体小球) 2 创建四个Solid模块 (1)摆杆 Shape : Brick Dimensions : [0.1 0.05 1] m (2)摆杆轴 Shape : Cylinder Radius : 0.02 m Le...

ReadAir的专栏 9037

kafka查询指定消费Group未消费的数据

最近线上出现kafka生产者发送成功了,但是消费者没有拉取到,出现这种现象是偶发的,就是在几分钟内有几个消息没消费到,后面就没再出现过。 首先先去卡夫卡上确认是否有消息堆积 下载kafka(不是src版的哦):http://kafka.apache.org/downloads 下载完毕后,解压到指定的文件夹中 1、查询topic,进入kafka目录: ./bin/kafka-topics.sh --list --zookeeper 172.16.331.120:2181 2.查询消费者组列表

HuangJianShanの游离世界 4661

AES攻击方法 :差分密码分析 boomerang attack飞去来器攻击

AES具有123比特的分组长度,三种可选的密钥长度(128,192,256) AES是一个迭代型密码,轮数依赖于密钥长度。如果密钥长度为128比特,则轮数为10;如果密钥长度为192比特,则轮数为12;如果密钥长度为256比特,则轮数为14; 混淆(Confusion) 混淆是为了让密钥与密文的统计信息之间的关系变得复杂,从而增加通过统计方法进行攻击的难度。混淆可以通过各种代换算法实现,如S盒、乘法(加)与异或等运算组合,为非线性部件。 扩散(Diffusion) 扩散是为了让明文的单个比特影像到

m0_67105022的博客 3492

kafka 重复消费和数据丢失_Kafka 的数据丢失和重复消费

本文将从消息的生产端和消息的消费端分析,数据是如何丢失的?数据是如何出现重复消费的,如何解决上述这种情况?利用 Kafka 高吞吐、可分区、可复制的特性, 在实时数据流分析应用领域,Kafka 在此大展身手。1/ 生产端 Producer消息格式:每个消息是一个 ProducerRecord 对象,必须指定消息所属的 Topic 和消息值 Value ,此外还可以指定消息所属的 Partitio...

weixin_39965490的博客 298

【博文汇总】I2C总线学习

将这一周学习I2C总线的文章汇总一下。 基础知识学习 触发器的建立时间和保持时间 如何学习总线技术 TTL电平和CMOS电平 深入理解 关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序

ce123的技术博客 6216

基于Python的农业市场价格抓取与供需分析:现代爬虫技术与实战应用

在正式开始爬虫开发之前,我们首先了解爬虫的基本概念和工作原理。爬虫(Web Scraping)是通过编程的方式,自动从互联网上获取信息的技术。它可以帮助我们提取HTML页面中的特定数据,通常用于收集并处理大量信息。发送HTTP请求:爬虫需要向目标网站发送请求,获取网站的HTML页面内容。解析HTML页面:通过HTML解析器对获取的页面内容进行解析,提取其中需要的数据。数据清洗与存储:将提取的数据进行清洗,去除多余的字符或无关内容,然后存储到合适的格式(如CSV文件、数据库等)中。数据分析与可视化。

2201_76125261的博客 1119

kafka不丢失数据与不重复消费数据

一、不丢失数据 1.生产者数据不丢失 同步模式:配置=1(只有Leader收到,-1所有副本成功,0不等待)。leader partition挂了,数据就会丢失。 解决:设置为-1保证produce写入所有副本算成功           producer.type=sync           request.required.acks=-1 异步模式,当缓冲区满了,如果配置为0(没有收到确认,一...

孙大迪迪的博客 1万+

LPDDR5 学习笔记02:上电初始化与下电时序

LPDDR5上电初始化流程需严格遵守时序要求:首先确保电源按顺序上电(VDD1→VDD2H→VDD2L→VDDQ),RESET_n保持低电平至电压稳定。初始化包含自动ZQ校准、命令总线训练(CBT)、WCK2CK电平校准和DQ总线训练四个关键阶段,需完成全部训练后才能正常操作。在双电源轨系统中,须在CBT前设置MR13寄存器。复位操作需保持RESET_n低电平至少tPW_RESET时间,断电时要求CS保持低电平且电源电压有序下降。非受控下电时电压斜率需低于0.5V/μs,器件生命周期内不得超过400次非受控

一只豌豆象的博客 2044

Kafka不丢失数据与不重复消费数据

文章目录一、不丢失数据1.生产者数据不丢失2.消费者数据不丢失二、不重复消费数据 一、不丢失数据 1.生产者数据不丢失 同步模式:配置=1(只有Leader收到,-1所有副本成功,0不等待)。leader partition挂了,数据就会丢失。 解决:设置为-1保证produce写入所有副本算成功           producer.type=sync           request.required.acks=-1 异步模式,当缓冲区满了,如果配置为0(没有收到确认,一满就丢弃),数据立刻丢弃 解

Li_Jian_Hui_的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Kafka重复消费,不丢失数据

kafka0.11.0.0版本正式支持精确一次处理语义exactly once semantic–EOS kafka幂等性参考 1)幂等producer 保证单个分区的只会发送一次,不会出现重复消息 2)事务(transation):保证原子性的写入多个分区,即写入到多个分区的消息要么全部成功,要么全部回滚 3)流式EOS:流处理本质上可看成是“”读取-处理-写入的管道“”。此EOS保证整个过程的...

开水烫鱼的博客 815

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

kafka数据不丢失不重复_Kafka 的数据丢失和重复消费

本文将从消息的生产端和消息的消费端分析,数据是如何丢失的?数据是如何出现重复消费的,如何解决上述这种情况?利用 Kafka 高吞吐、可分区、可复制的特性, 在实时数据流分析应用领域,Kafka 在此大展身手。1/ 生产端 Producer消息格式:每个消息是一个 ProducerRecord 对象,必须指定消息所属的 Topic 和消息值 Value ,此外还可以指定消息所属的 Partitio...

weixin_42139429的博客 180

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kafka重复消费和丢失数据研究

Kafka重复消费原因 底层根本原因:已经消费了数据,但是offset没提交。 原因1:强行kill线程,导致消费后的数据,offset没有提交。 原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用consumer.unsubscribe() 则有可能部分offset没提交,下次重...

aduzz62084的博客 194

Kafka 数据丢失和重复消费问题

首先介绍下 producer与consumer有可能的delivery guarantee: At most once 消息可能会丢,但绝不会重复传输 At least one 消息绝不会丢,但可能会重复传输 Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的 一、数据丢失问题: 生产方: producer 的deliver guarantee 可以通过re...

Java部落格 1889

平台搭建---Kafka使用---Kafka重复消费和丢失数据

来源 1、Kafka保证数据不丢失的原理 1.1、kafka消息的位置 用好Kafka,维护其消息偏移量对于避免消息的重复消费与遗漏消费,确保消息的Exactly-once是至关重要的。 kafka的消息所在的位置Topic、Partitions、Offsets三个因素决定。 Kafka消费者消费的消息位置还与consumer的group.id有关。 consumerOffse

3万+

kafka如何保证数据不被重复消费并且不丢失数据

Kafka如何保证数据不重复消费,不丢失数据 不重复消费: 1.幂等操作,重复消费不会产生问题 2. dstream.foreachRDD {(rdd, time) = rdd.foreachPartition { partitionIterator => val partitionId = TaskContext.get.partitionId() val ...

我知道你是高手的博客 4713

Kafka 如何保证不重复消费又不丢失数据?

在大数据时代,消息队列作为分布式系统中不可或缺的一部分,承担着数据传输和解耦的重要职责。Kafka 作为一款高性能、高吞吐量的消息队列系统,被广泛应用于日志收集、监控数据聚合、流处理等多个领域。然而,在实际应用中,如何保证消息的不重复消费且不丢失数据,成为了一个重要的问题。本文将深入探讨 Kafka 在这两个方面的机制和策略,并结合具体案例进行分析。

cda2024的博客 1484

Kafka重复消费和丢失数据问题

Kafka重复消费原因 底层根本原因:已经消费了数据,但是offset没提交。 原因1:强行kill线程,导致消费后的数据,offset没有提交。 原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用&nbsp;consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重...

smile_lty的博客 3318

kafka数据不丢失不重复_kafka如何保证数据不被重复消费并且不丢失数据

Kafka如何保证数据不重复消费,不丢失数据不重复消费:1.幂等操作,重复消费不会产生问题2. dstream.foreachRDD {(rdd, time) =rdd.foreachPartition { partitionIterator =>val partitionId = TaskContext.get.partitionId()val uniqueId = generateUni...

weixin_39629631的博客 627

kafka数据丢失以及重复消费数据分析

kafka数据丢失以及重复消费数据 1、Kafka重复消费原因 底层根本原因:已经消费了数据,但是offset没提交。 原因1:强行kill线程,导致消费后的数据,offset没有提交。 原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费。 原因3(重复消费最常见的原因)...

sunyaoxjtu的博客 651
上一篇: Kafka 消息重复消费问题学习
下一篇: go语言入门
Computer_hello
博客等级 码龄10年 2粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值