Kafka丢数据、重复消费、顺序消费的问题

Kafka~消息系列问题解决:重复消费问题、消费重试机制、消息积压问题 那么这里会有个问题:什么时候提交 offset 合适?在Kafka中,有三种常见的消息传递语义:At-least-once、At-most-once、Exactly-once。其中At-least-once和Exactly-once是最常用的。At-least-once消费语义意味着消费者至少消费一次消息,但可能会重复消费同一消息。在At-least-once语义中,。这意味着该消息将在下一次重试时再次被消费。 阅读详情

面试官:今天我想问下,你觉得Kafka会丢数据吗?

候选者:嗯,使用Kafka时,有可能会有以下场景会丢消息

候选者:比如说,我们用Producer发消息至Broker的时候,就有可能会丢消息

候选者:如果你不想丢消息,那在发送消息的时候,需要选择带有 callBack的api进行发送

候选者:其实就意味着,如果你发送成功了,会回调告诉你已经发送成功了。如果失败了,那收到回调之后自己在业务上做重试就好了。

候选者:等到把消息发送到Broker以后,也有可能丢消息

候选者:一般我们的线上环境都是集群环境下嘛,但可能你发送的消息后broker就挂了,这时挂掉的broker还没来得及把数据同步给别的broker,数据就自然就丢了

候选者:发送到Broker之后,也不能保证数据就一定不丢了,毕竟Broker会把数据存储到磁盘之前,走的是操作系统缓存

候选者:也就是异步刷盘这个过程还有可能导致数据会丢

候选者:嗯,到这里其实我已经说了三个场景了,分别是:producer -> broker ,broker->broker之间同步,以及broker->磁盘

候选者:要解决上面所讲的问题也比较简单,这块也没什么好说的…

候选者:不想丢数据,那就使用带有callback的api,设置 acks、retries、factor等等些参数来保证Producer发送的消息不会丢就好啦。

面试官:嗯…

候选者:一般来说,还是client 消费 broker 丢消息的场景比较多

面试官:那你们在消费数据的时候是怎么保证数据的可靠性的呢?

候选者:首先,要想client端消费数据不能丢,肯定是不能使用autoCommit的,所以必须是手动提交的。

候选者:我们这边是这样实现的:

候选者:一、从Kafka拉取消息(一次批量拉取500条,这里主要看配置)时

候选者:二、为每条拉取的消息分配一个msgId(递增)

候选者:三、将msgId存入内存队列(sortSet)中

候选者:四、使用Map存储msgId与msg(有offset相关的信息)的映射关系

候选者:五、当业务处理完消息后,ack时,获取当前处理的消息msgId,然后从sortSet删除该msgId(此时代表已经处理过了)

候选者:六、接着与sortSet队列的首部第一个Id比较(其实就是最小的msgId),如果当前msgId<=sort Set第一个ID,则提交当前offset

候选者:七、系统即便挂了,在下次重启时就会从sortSet队首的消息开始拉取,实现至少处理一次语义

候选者:八、会有少量的消息重复,但只要下游做好幂等就OK了。

面试官:嗯,你也提到了幂等,你们这业务怎么实现幂等性的呢?

候选者:嗯,还是以处理订单消息为例好了。

候选者:幂等Key我们由订单编号+订单状态所组成(一笔订单的状态只会处理一次)

候选者:在处理之前,我们首先会去查Redis是否存在该Key,如果存在,则说明我们已经处理过了,直接丢掉

候选者:如果Redis没处理过,则继续往下处理,最终的逻辑是将处理过的数据插入到业务DB上,再到最后把幂等Key插入到Redis上

候选者:显然,单纯通过Redis是无法保证幂等的(:

候选者:所以,Redis其实只是一个「前置」处理,最终的幂等性是依赖数据库的唯一Key来保证的(唯一Key实际上也是订单编号+状态)

候选者:总的来说,就是通过Redis做前置处理,DB唯一索引做最终保证来实现幂等性的

面试官:你们那边遇到过顺序消费的问题吗?

候选者:嗯,也是有的,我举个例子

候选者:订单的状态比如有 支付、确认收货、完成等等,而订单下还有计费、退款的消息报

候选者:理论上来说,支付的消息报肯定要比退款消息报先到嘛,但程序处理的过程中可不一定的嘛

候选者:所以在这边也是有消费顺序的问题

候选者:但在广告场景下不是「强顺序」的,只要保证最终一致性就好了。

候选者:所以我们这边处理「乱序」消息的实现是这样的:

候选者:一、宽表:将每一个订单状态,单独分出一个或多个独立的字段。消息来时只更新对应的字段就好,消息只会存在短暂的状态不一致问题,但是状态最终是一致的

候选者:二、消息补偿机制:另一个进行消费相同topic的数据,消息落盘,延迟处理。将消息与DB进行对比,如果发现数据不一致,再重新发送消息至主进程处理

候选者:还有部分场景,可能我们只需要把相同userId/orderId发送到相同的partition(因为一个partition由一个Consumer消费),又能解决大部分消费顺序的问题了呢。

面试官:嗯…懂了

【对线面试官-移动端】系列 一周两篇持续更新中!

【对线面试官-电脑端】系列 一周两篇持续更新中!

原创不易!!求三连!!

消息中间件 我们使用rabbitMQ来确保mySQL和redis间数据双写的一致性,这要求我们实现消息的高可用性,具体措施包括:1)开启生产者确认机制,确保消息能被送达队列,如有错误则记录日志并修复数据。1)消息若超时未消费则变为死信,队列可绑定死信交换机,实现延迟功能。2)另一种方法是安装rabbitMQ的死信插件,简化配置,在声明交换机时指定为死信交换机,并设置消息超时时间。我们遇到过消息重复消费的问题,处理方法是:1)设置消费者为自动确认模式,如果服务在确认前宕机,重启后可能会再次消费同一消息。 阅读详情

相关推荐

Kafka如何保证消息的消费顺序【全局有序、局部有序】、Kafka如何保证消息不被重复消费、Kafka为什么这么快?【重点】、Kafka常见问题汇总【史上最全】

Kafka如何保证消息的消费顺序【全局有序、局部有序】、Kafka如何保证消息不被重复消费、Kafka为什么这么快?【重点】这个时候重发的消息会被服务端拒掉从而避免消息重复。并且为了达到严格的顺序消费还需要。比如操作订单消息,可以把订单id作为key,在消费消息时,通过setnx命令设置一下,Kafka如何保证消息的消费顺序【全局有序、局部有序】、Kafka如何保证消息不被重复消费、Kafka为什么这么快?【重点】、Kafka常见问题汇总【史上最全】

one2excellent的博客 9419

3、kafka常见问题

kafka常见问题 1. kafka名词解释 Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。 Topic:一类消息,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。 Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。 ...

爱欧米 3833

kafka专题:kafka的消息丢失、重复消费、消息积压等线上问题汇总及优化

文章目录1. 生产中的kafka问题汇总 1. 生产中的kafka问题汇总

qq_1149513559的博客 1万+

kafka 消息丢失和重复消费

kafka 消息丢失和重复消费前言消息丢失producerconsumer重复消费 前言 在使用mq中间件时,如果消费数据处理不当可能会引起消息丢失和重复消费的问题。本文针对kafka的这两个问题进行场景分析和可行性方案说明。 消息丢失 消息丢失一般指消息发送方producer和消息消费方consumer两方面。 producer 消息发送方可以通过配置request.required.acks属性来保证消息的安全发送,值包括: 0:表示不进行消息接收是否成功的确认 1:表示当Leader接收成功时确认

qq_38245668的博客 1132

MQ那点破事,消息丢失、重复消费、消费顺序、堆积、事务、高可用....

大家好,我是 Tom哥~马上要开启国庆小长假了,祝大家节日快乐,吃喝玩乐走起~为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于消息队列,面试官一般会问哪些问题。本篇文章的目录:消息队列的应用场景?答案:1、异步处理  2、流量削峰填谷  3、应用解耦  4、消息通讯异步处理。将一个请求链路中的非核心流程,拆分出来,异步处理,减少主流程链路的处理逻辑,缩短RT,提升吞吐量。如:注册新用户发短信通知。削峰填谷。避免流量暴涨,打垮下游系统,前面会加个消息队列,平滑

公众号:微观技术 6195

RocketMQ和Kafka的区别,以及如何保证消息不丢失和重复消费

4)unclean.leader.election.enable = false 当leader副本发生故障时不会从followers副本中和leader副本同步程度达不到要求的副本中选出leader,降低了消息丢失的可能性。但是这样也会带来重复消费的情况,比如,消费了一半还没提交offset突然挂掉,那么这个消息理论上会被消费两次,这种情况怎么办?当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。

qq_34704689的博客 2680

消息中间件常见问题及解决方案

消息中间件常见问题及解决方案 消息中间间(activemq, rabbitmq, rocketmq, kafka) 优势:解耦、异步、削峰 重复消费问题 1.利用数据库主键唯一性保证重复消费问题; 2.利redis的原子性保证数据不会重复; 丢消息问题 1.acks设置为All,保证从节点同步后反馈客户端,从而保证不会丢消息; 消息挤压问题 1.将消息挤压的分区分散到多个分区中,再启动多个消费端; 2.消费端接收到消息后,直接将消持久化到DB中,立即ACK,后面再慢慢处理DB中持久化的数据; 顺序消费问题

weixin_38376791的博客 391

Kafka消费异常处理策略及重试机制

在Kafka消费过程中,异常处理和重试机制是确保消息可靠消费的重要组成部分。通过合理的异常处理策略和重试机制,我们可以提高消费者的容错性和稳定性。在实际应用中,可以根据具体业务需求和系统情况选择适合的处理方式,并进行合理的监控和报警,以确保及时发现和解决异常情况。可以使用监控工具,如Prometheus和Grafana,来实时监控消费者的状态,并设置相应的报警规则,及时通知运维人员。请注意,上述示例代码仅提供了一种简单的重试机制实现方式,实际应用中可能需要根据具体需求进行定制和优化。1.3. 监控和报警。

CvhShell的博客 3753

kafka如何保证数据的顺序消费

在对kafka的理解中,常常会被问及到kafka如何保证数据的顺序消费、kafka的数据重复消费怎么处理、如何保证kafka中数据不丢失?今天先说说数据的顺序消费问题。 关于顺序消费的几点说明: ①、kafka的顺序消息仅仅是通过partitionKey,将某类消息写入同一个partition,一个partition只能对应一个消费线程,以保证数据有序。 ②、除了发送消息需要指定partition...

QvQ 4万+

Flink消费Kafka中的重试机制及其引起的问题

当配置了较长的"retry.backoff.ms"值时,Flink在处理失败的消息之前会等待更长的时间。因此,在配置"retry.backoff.ms"时,需要考虑到实时性的要求,避免过长的等待时间。可以选择一个合适的等待时间,以确保消息在失败后有足够的时间恢复,同时避免过长的处理延迟。使用这些配置选项可以确保在出现故障或错误的情况下,Flink能够尽力处理并重试消息,从而提高数据处理的可靠性。在实际应用中,需要根据具体的业务需求和系统情况进行配置,并进行充分的测试和优化,以获得最佳的性能和可靠性。

JieLun_C的博客 695

Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思

最近因为工作原因需要使用Qt开发一个类似于Visio的流程图组件,需满足基本的流程图功能,图元类型可自定义扩展,不同图元存有各类自定义数据,可以保存为xml文件,可以读取xml文件生成流程图等等。

qq_43793182的博客 1万+

【MQ】kafka(四)——kafka消费者如何消费的?如何防止重复消费?如何顺序消费?

前面博客小编向大家分享了 kafka如何保证消息不丢失?,基本是从producer和broker来分析的,producer要支持重试和acks,producer要做好副本和及时刷盘落地。这篇博客呢,就跟大家一起聊一下 kafka 消费者如何消费的?如何避免重复消费?消费流程:一般我们消费测试是不会变的,都使用默认的,也就是第一种,range策略。默认策略,保证基本是均衡的。 计算公式 : n = 分区数/消费者数 m = 分区数%消费者数 前m个消费者,消费n+1个,剩余的消费n个 eg:12个par

哈士奇 3万+

【架构师面试-缓存与搜索-1】-缓存与缓存置换策略源码实现

1:什么是缓存 缓存:加速数据访问的存储,降低延迟(latency),提升吞吐量(Throughput)的利器。 1:缓存演进历史 1. 查库 2. ConcurrentHashMap 3. LRU 4. Guava Cache 5. 分布式缓存(redis,MemCache) 6. 多级缓存 2:在什么地方加缓存 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 举个栗子:假设一个网站,需要提高性能,缓存可以放在浏览器,可以放

chongfa2008的博客 6437

【Kafka】——顺序消费、重复消费、消息丢失

前言 Kafka可以说是为分布式而生的一个消息中间件,功能很强大,提到这个,我们可能就会想到消息中间件常提到的几个问题,消费的顺序性、重复消费、消息丢失等问题,接下来我们一一来看。 ...

山山来驰的博客 2704

解忧杂货铺(四):Hightec生成HEX方法+小功能开启

Hightec使用的一些常用技能

梦想技术家 2160

【报错解决】彻底解决 MySQL 登录报错 ERROR 1045 (28000)

MySQL 报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 通常是由于用户名或密码错误、权限不足、服务未启动或配置文件异常导致的。通过检查并确认密码、重置 root 用户密码、授予完整权限、校验配置文件以及确保 MySQL 服务正常运行,可以彻底解决该问题。掌握这一流程不仅能够恢复 root 登录,还能保障数据库的安全性与稳定性。

博客 1749

kafka消费者是如何消费的?如何防止重复消费?如何顺序消费?

kafka消费者是如何消费的?如何防止重复消费?如何顺序消费?

qq_31674229的博客 3287

UNet改进(47):Deformable Convolution在UNet中的集成与应用

本文提出了一种可变形U-Net(DeformableUNet)结构,通过在U-Net的双卷积模块中集成可变形卷积(DeformConv2d)来提升模型对物体形变和复杂结构的建模能力。传统卷积受限于固定感受野,而可变形卷积通过动态调整采样位置,能更好地适应不规则形状。实现中,在DoubleConv模块的第二个卷积层替换为可变形卷积,同时保持第一层为标准卷积以确保稳定性。实验表明,该方法在保持参数量基本不变的情况下,显著提升了分割精度(mIoU从0.712提升到0.743)。

2501_91516851的博客 201

kafka顺序消费&消息丢失&消息重发&重复消费

#标题 ##标题

xie_peng_cheng的博客 2089

2024年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++小学组:带解析)

2024全国青少年信息素养大赛C++算法创意实践挑战赛初赛真题及解析

王老师青少年编程 2807

如何用 Claude Code 阅读和理解陌生代码

摘要: 在接手陌生代码时,Claude Code能显著提升理解效率。核心策略是结构化拆解而非逐行阅读: 从整体入手:先扫描目录结构、定位核心模块,建立项目地图; 聚焦关键路径:通过数据流追踪、异常逻辑分析,识别技术债与风险点; 规避常见错误:避免抽象提问或一次性提交全部代码,应分模块精准提问; 高阶应用:可生成逻辑分层图、标记高复杂度区域,甚至定制阅读顺序。 最终目标是通过结构优先的提问策略,将理解周期从数天压缩至数小时。

sg_knight的专栏 1019

Kafka及Kafka消费者的消费问题及线程问题

kafka消费与线程池遇到的问题分析

胡买提 6031

用生成式AI自动生成测试用例的完整教程

本文旨在帮助测试工程师、开发人员快速掌握“生成式AI自动生成测试用例”的核心技术,覆盖从概念理解、工具选择到实战落地的全流程。无论是Web应用、API接口还是移动端功能测试,你都能找到可复用的方法。本文将按照“概念→原理→实战→避坑”的逻辑展开:先通过生活案例理解生成式AI如何生成测试用例,再拆解核心算法原理,接着用Python代码演示完整生成流程,最后分享实际应用中的优化技巧和未来趋势。生成式AI:能“创造内容”的AI模型(如ChatGPT、CodeLlama),像会写作文的智能笔。测试用例。

AIGC应用创新大全的博客 1580

Kafka导致重复消费原因和解决方案

问题分析 导致kafka的重复消费问题原因在于,已经消费了数据,但是offset没来得及提交(比如Kafka没有或者不知道该数据已经被消费)。 总结以下场景导致Kakfa重复消费: 原因1:强行kill线程,导致消费后的数据,offset没有提交(消费系统宕机、重启等)。 原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费。 例如: try { consumer.unsub

LewinLea的技术博客 9219

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 【对线面试官】Kafka基础
下一篇: 面试官问我MySQL索引,我真的是
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值