Kafka 消息丢失如何处理?

今天给大家分享一个在面试中经常遇到的问题:Kafka 消息丢失该如何处理?

这个问题啊,看似简单,其实里面藏着很多“套路”。

来,咱们先讲一个面试的“真实”案例。

图片

面试官问:“Kafka 消息丢失如何处理?”

小明一听,反问:“你是怎么发现消息丢失了?”

面试官顿时一愣,沉默了片刻后,可能有点不耐烦,说道:“这个你不用管,反正现在发现消息丢失了,你就说如何处理。”

小明一头雾水:“问题是都不知道怎么丢的,处理起来岂不是瞎搞吗?”

画面一黑,面试官离开了会议室,留小明一个人凌乱在风中……

👀 这段子虽然搞笑,但实际工作中,确实“消息丢失”这个事儿有点让人摸不着头脑。

大家有没有想过:消息丢失的定义到底是什么?其实,发现消息丢失的过程,才是处理问题的关键!

图片

在用 Pub/Sub 类中间件,比如 Kafka 或 RocketMQ 时,消息丢失可能有很多原因,包括生产者、消费者和网络传输等各个环节。

我们今天就结合实际工作中遇到的情况,聊聊到底怎么发现消息丢失,又该怎么处理。😎

首先,我们要搞清楚消息丢失的几种典型场景:

1.生产者消息发送失败:这个比较简单,如果生产者发消息时,网络抖动、服务宕机或 Kafka broker 挂了,那消息就丢了。

这时候生产者通常会重试,但是如果重试策略不当,还是可能丢消息。

   

2.消费者消费消息失败:最常见的是消费者拉取了消息,但是业务处理失败,或者消费后没有提交 offset,导致消息“看似”消费了,实际根本没处理。

这种情况不算真正的消息丢失,但你业务数据不一致,这锅还是要 Kafka 来背。😂

3. 网络异常导致消息丢失:有时候消息发送成功了,但是因为网络问题,导致消费者没能拉到这些消息,这类情况更难排查。

OK,分析了几种可能性,接下来看看有哪些方法可以帮助我们及时发现这些问题。

1.监控和告警系统

  

监控是最基础的保障手段。一般来说,Kafka 提供了很多指标可以监控,比如生产端和消费端的吞吐量、消息积压(lag)情况、消费者组的 offset 等等。

通过这些监控指标,一旦消费端的消息积压开始异常增长,或者 offset 停滞不前,就说明很可能有消息丢失了。

很多公司会用 Prometheus + Grafana 来做监控和可视化,再配合告警系统(如 Alertmanager)实时提醒。

比如可以监控 `kafka_consumer_lag` 这个指标,一旦消息积压超过预设阈值,就触发告警。

# Prometheus 配置监控 Kafka 消费者积压
kafka_consumer_lag{consumer_group="your-consumer-group", topic="your-topic"} > 100

在工作中,这类告警往往是消息丢失的第一个信号,反应速度极快。

2.消息追踪机制

消息追踪就像在每个消息上打个“追踪码”,确保每条消息都能被追踪到。

具体做法是:生产者在发送每条消息时,生成一个唯一的 `message_id`,消费者在消费时同样记录消费的 `message_id`。

通过对比生产端和消费端的 ID,就可以发现有没有消息“掉队”了。

在实际应用中,通常会通过日志来记录这些 `message_id`,并定期检查对账,保证所有消息都正确处理了。

// 生产者发送消息时生成 message_id
String messageId = UUID.randomUUID().toString();
ProducerRecord<String, String> record = new ProducerRecord<>("your-topic", messageId, messageContent);
producer.send(record);// 消费者消费消息时记录 message_id
public void consumeMessage(ConsumerRecord<String, String> record) {String messageId = record.key();  // 获取 message_id// 将 message_id 存储到日志或数据库中,用于后续追踪log.info("Consumed message with ID: {}", messageId);
}

3.消息确认机制

Kafka 本身有个很经典的机制,就是手动提交offset。消费者在处理完消息后,才提交消费位置的 offset。

如果消费失败了,不提交 offset,Kafka 就会重新分配这条消息,避免消息丢失。

很多时候,消息丢失的“锅”其实是消费者自己在消费时出了问题,明明没处理完却偷偷提交了 offset,让 Kafka 以为消息已经处理完毕了。

手动提交 offset 就能很好地避免这种情况。

public void consumeMessages() {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {try {// 处理消息逻辑processMessage(record);// 成功处理后提交 offsetconsumer.commitSync();} catch (Exception e) {// 处理失败不提交 offset,Kafka 会重试log.error("Failed to process message, will retry.", e);}}
}

​​​​​​​

4.消息重试和补偿机制

为了解决偶发性的消费失败,很多公司会为 Kafka 消费端加一个重试机制。

当消息处理失败时,重新将消息放回队列,或者放到一个死信队列(Dead Letter Queue, DLQ)里,然后专门处理这些异常消息。

// 如果消息处理失败,将其放回死信队列
try {processMessage(record);
} catch (Exception e) {producer.send(new ProducerRecord<>("dlq-topic", record.key(), record.value()));
}

这个方式虽然不能彻底避免消息丢失,但能保证消息不会轻易丢失,特别是一些重要业务场景中,消息的可靠性至关重要。

5.多副本存储

Kafka 还有一个核心功能,就是多副本机制,即消息在多个 broker 上都有副本。这样即使某个 broker 挂了,其他副本也能提供消息。

通过设置 `replication.factor` 参数,我们可以指定 Kafka 每条消息的副本数,确保即使一台机器挂了,消息也不会丢失。

# Kafka Topic 多副本配置
replication.factor=3
 

最后,真正发现消息丢失了,怎么办呢?这里有一些基本的补救措施:

1.检查消费端日志:首先要确定消息到底有没有消费。如果消费端日志显示消费失败,重新处理即可。

   

2.重发消息:如果消费端确实没处理成功,可以将消息重新发送到 Kafka,或者从备份中恢复并重放消息。

3.处理丢失后的补偿:业务上可能会涉及补偿措施,比如通知相关人员手动处理,或者对丢失的数据进行回补。

总之,消息丢失不算是特别常见的问题,但一旦遇到,还是需要冷静排查问题源头。

Kafka 等 Pub/Sub 中间件本身已经有比较强大的机制来应对这些场景,只要结合业务需求,做好监控和容错机制,基本都能把问题压到最小。

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

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

相关文章

【AWDP】 AWDP 赛制详解应对方法赛题实践 量大管饱

文章首发于【先知社区】&#xff1a;https://xz.aliyun.com/t/15535 一、AWDP概述 AWDP是什么 AWDP是一种综合考核参赛团队攻击、防御技术能力、即时策略的攻防兼备比赛模式。每个参赛队互为攻击方和防守方&#xff0c;充分体现比赛的实战性、实时性和对抗性&#xff0c;对参…

_Array类,类似于Vector,其实就是_string

例子&#xff1a; using namespace lf; using namespace std;int main() {_Array<int> a(10, -1);_Array<_string> s { _t("one"), _t("two") };_pcn(a);_pcn(s);} 结果&#xff1a; 源代码_Array.h&#xff1a; /***********************…

FastText 和 Faiss 的初探了解

概览 大模型目前已经是如火如荼的程度&#xff0c;各个大厂都有推出面向大众的基础大模型&#xff0c;同时诸多行业也有在训练专有大模型&#xff0c;而大模型的发展由来却是经过多年从文本检索生成、深度学习、自然语言处理&#xff0c;在Transformer架构出来后&#xff0c;才…

python的流程控制语句之制作空气质量评估系统

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

什么是数据库回表,又该如何避免

目录 一. 回表的概念二. 回表的影响三. 解决方案1. 使用覆盖索引2. 合理选择索引列3. 避免选择不必要的列4. 分析和优化查询5. 定期更新统计信息6. 避免使用SELECT DISTINCT或GROUP BY7. 使用适当的数据库设计 数据库中的“回表”是指在查询操作中&#xff0c;当数据库需要访问…

【免费】CISSP官方习题集第4版

伴随2004年4月CISSP新大纲发布&#xff0c;CISSP官方习题集第4版(OPT v4)已于2024年5月出版&#xff1a; 本人维护的中英对照8个知识域分章节练习已同步更新完成&#xff0c;在保持v3版内容基础上&#xff0c;增补了所有v4新内容&#xff0c;免费供考友们使用&#xff0c;访问方…

离线数仓DWD层

离线数仓DWD层 DWD层设计要点&#xff1a;9.1 交易域加购事务事实表9.2 交易域下单事务事实表9.3 交易域取消订单事务事实表9.4 交易域支付成功事务事实表9.5 交易域退单事务事实表9.6 交易域退款成功事务事实表9.7 交易域购物车周期快照事实表9.8 工具域优惠券领取事务事实表9…

springboot修改组件扫描包位置

步骤很详细&#xff0c;直接上教程 问题分析 默认情况下组件扫描包范围为启动类所在包及其子包 解决方法 我们只需要在启动类上面加个注解配置扫描范围 效果演示 温馨提示 非必要不建议修改&#xff0c;按规范创建项目结构一般不会出现这个问题

uniapp 发布苹果IOS详细流程,包括苹果开发者公司账号申请、IOS证书、.p12证书文件等

记录一下uniapp发布苹果IOS的流程。 一、苹果开发者公司账号申请 1、邓白氏编码申请&#xff08;先申请公司邓白氏编码&#xff0c;这一步需要1-2周&#xff0c;没有这个编码苹果开发者没法申请&#xff0c;已有编码的跳过此步骤&#xff09;&#xff1a; 1&#xff09;联系苹…

什么是职场?职场的本质又是什么呢?

最近&#xff0c;经常看到很多职场相关的&#xff0c;比如职场必备技能、职场人际关系、职场晋升等等&#xff0c;这些都是职场的一些方面&#xff0c;但是却少有人来深入剖析什么是职场&#xff0c;职场的本质又是什么&#xff0c;今天我们就来一起来聊一聊&#xff0c;到底职…

【MySQL】MySQL索引与事务的透析——(超详解)

前言 &#x1f31f;&#x1f31f;本期讲解关于MySQL索引事务&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【MySQL】MySQL表的增删改查&#xff08;进阶篇&#xff09;——之查询操作&#xff08;超级详解&#xff09;-CSDN博客 &#x1f308;感…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

HTML贪吃蛇游戏

文章目录 贪吃蛇游戏 运行效果代码 贪吃蛇游戏 贪吃蛇是一款经典的休闲益智游戏。本文将通过HTML5和JavaScript详细解析如何实现一个简易版的贪吃蛇游戏。游戏的主要逻辑包括蛇的移动、碰撞检测、食物生成等功能。以下是游戏的完整代码及注释解析。&#xff08;纯属好玩&#…

【python】OpenCV—Mask RCNN for Object Detection and Instance Segmentation

文章目录 1、任务描述2、MASR RCNN 网络结构3、方法实现4、结果展示5、涉及到的库getPerfProfile 6、参考 1、任务描述 利用 mask rcnn 网络&#xff0c;进行图片和视频的目标检测和实例分割 2、MASR RCNN 网络结构 3、方法实现 # Copyright (C) 2018-2019, BigVision LLC (L…

SQL进阶技巧:火车票相邻座位预定一起可能情况查询算法 ?

目录 0 场景描述 1 数据准备 2 问题分析 2.1 分析函数法 2.2 自关联求解 3 小结 如果觉得本文对你有帮助&#xff0c;那么不妨也可以选择去看看我的数字化建设通关指南博客专栏 &#xff0c;或许对你更有用。专栏原价99&#xff0c;现在活动价29.9&#xff0c;按照阶梯…

什么是上拉,下拉?

上拉就是将引脚通过一个电阻连接到电源&#xff0c;作用&#xff1a;1.使IO口的不确定电平稳定在高点平&#xff0c;2、为了增加IO口拉电流的能力。 下拉就是将引脚通过一个电阻与GND相连&#xff0c;作用&#xff1a;1.从器件输出电流 2.当IO口为输入状态时&#xff0c;引脚的…

GitHub Star 数量前 13 的自托管项目清单

一个多月前&#xff0c;我们撰写并发布了这篇文章《终极自托管解决方案指南》。在那篇文章里我们深入探讨了云端服务与自托管方案的对比、自托管的潜在挑战、如何选择适合自托管解决方案&#xff0c;并深入介绍了五款涵盖不同场景的优秀自托管产品。 关于自托管的优势&#xf…

快速了解高并发解决方案

对《高并发的哲学原理》的个人总结&#xff0c;原书地址如下 https://pphc.lvwenhan.com/ 本书的核心思想就是拆分&#xff0c;服务细化拆分多资源并行。 通用设计方法 例子&#xff1a;每秒100万次http请求 通过架构解决性能问题&#xff0c;在面对并发需求时&#xff…

Tuxera NTFS for Mac 2023绿色版

​ 在数字化时代&#xff0c;数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作&#xff0c;然而&#xff0c;由于MacOS系统默认不支持NTFS的写操作&#xff0c;这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…

idea激活页面怎么打开

打开Help------选择Register 然后就可以选择激活方式了