Kafka 的这 6 个场景会丢失消息

news2024/11/25 20:25:56

一、概述

今天来聊一聊我们使用 Kafka 的时候,怎样能保证不丢失消息呢的话题。首先我们看一下 Kafka 的架构图:
在这里插入图片描述

二、异步发送

Producer 异步发送是丢失消息比较多的场景,Kafka 异步发送的代码如下:

ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value);
RecordMetadata metadata = producer.send(record).get();

Producer 发送消息后,不用等待发送结果,就可以继续执行后面的逻辑。如果发送失败,就会丢失消息。
Kafka 提供了回调方法,可以同步等待发送结果,这样降低了发送效率,但可以对发送失败的场景进行处理,比如重新发送。

ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value);
producer.send(record,
                (Callback) (metadata, e) -> {
                    if(e != null) {
                        e.printStackTrace();
                    } else {
                        System.out.println("The offset of the record we just sent is: " + metadata.offset());
                    }
                });

三、配置 acks=0

从文章开头的架构图中可以看到,Broker Leader 节点收到消息后,会同步给 Follower 节点。

在 Producer 端有一个 acks 配置,说明如下 :

  • acks=0:Producer 发送消息后不等待 Broker 的响应;
  • acks=1:Producer 发送消息后,Leader 节点写入消息成功后给 Producer 发送响应;
  • acks=all/-1:Producer 发送消息后,需要 ISR 列表中所有 Broker 节点都写入消息成功才会给 Producer
    发送响应。

注意:acks=all/-1 是最高安全级别,可以配合 min.insync.replicas 参数使用,当 acks=all/-1 时,min.insync.replicas 表示 ISR 列表中最小写入消息成功的副本数。

如下图,cks=all/-1,当 min.insync.replicas=2 时,
在这里插入图片描述
如果 ISR 列表中有【Broker0、Broker1】,即使 Broker2 写入消息失败,也会给 Producer 返回成功。

如果 ISR 列表中只有【Broker0】,则无论如何都不会给 Producer 返回成功。

如果 ISR 列表中有【Broker0、Broker1、Broker2】,则 3 个 Broker 都写成功才会给 Producer 返回成功。

四、 发送端重试

如果配置 retries=0,Producer 发送消息失败后是不会进行重试的,要保证消息不丢失,可以增加 retries 的配置值,避免因为网络抖动而造成的发送失败。

五、Follower 落后太多

Kafka Broker 有一个参数:unclean.leader.election.enable,这个参数值说明如下:

true:允许 ISR 列表之外的节点参与竞选 Leader;
false:不允许 ISR 列表之外的节点参与竞选 Leader。
如果设置为 true,也是会丢失消息的,看下图:
在这里插入图片描述
如果 Leader 和 Follower1 都挂了,这时就要考虑是否让 Follower2 参加竞选,把 unclean.leader.election.enable 参数值设置为 true,则 Follower2 也可以竞选 Leader,并且作为唯一存活节点成功竞选为 Leader,但是它并没有同步到偏移量为 3、4、5 的消息,

而之前的 Leader 上线后,成为了 Follower,因为 Follower 的 LEO(Log End Offset)不能大于 Leader,所以之前偏移量为 3、4、5 的消息就被丢弃了。如下图:
在这里插入图片描述
所以,要保证消息不丢失,unclean.leader.election.enable 这个参数值要设置为 false。

六、Broker 宕机

为了提升性能,Kafka 使用 Page Cache,先将消息写入 Page Cache,采用了异步刷盘机制去把消息保存到磁盘。如果刷盘之前,Broker Leader 节点宕机了,并且没有 Follower 节点可以切换成 Leader,则 Leader 重启后这部分未刷盘的消息就会丢失。

这种场景下多设置副本数是一个好的选择,通常的做法是设置 replication.factor >= 3,这样每个 Partition 就会有 3 个以上 Broker 副本来保存消息,同时宕机的概率很低。

同时可以配合场景二中的参数 min.insync.replicas > 1(不建议使用默认值 1),表示消息至少要被成功写入到 2 个 Broker 副本才算是发送成功。

注意:参数配置要保证 replication.factor > min.insync.replicas,通常设置成 replication.factor = min.insync.replicas + 1。如果这 2 个参数设置成相等,则只要有一个 Broker 节点宕机,Broker 就无法给 Producer 返回发送成功,系统可用性降低。

七、并发消费

如果消费端采用多线程并发消费,很容易因为并发更新 Offset 导致消费失败。看下图:
在这里插入图片描述
线程 1 拉取 3 条消息把 Offset 更新成 3,线程 2 把 Offset 更新成 6,线程 3 把 Offset 更新成 9。这时如果线程 2 消费失败了,想要重新消费,但是 Offset 已经更新到了 9,不能拉取到 Offset 9 以前的消息了。

所以,消费者并发消费很可能会造成消息丢失,如果对消息丢失很敏感,最好使用单线程来进行消费。

如果采用多线程,可以把 enable.auto.commit 设置为 false,这样相当于每次消费完后手动更新 Offset。不过这又会带来重复消费问题,比如上面的例子,如果线程 2 消费失败了,则手动把 Offset 更新成 3,线程 3 消费成功后,再次拉取,还会拉取到 6、7、8 这三条数据。因此消费端需要做好幂等处理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5+CSS3小实例:菜单按钮的三种切换动画

实例:菜单按钮的三种切换动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initia…

机器视觉系统:电容表面瑕疵缺陷检测的精准“守望者”

在电子行业中&#xff0c;电容器作为关键元件&#xff0c;其质量和性能对于整个产品的稳定性和可靠性至关重要。电容器的表面质量直接影响其性能和寿命&#xff0c;因此&#xff0c;对电容表面瑕疵缺陷的精确检测显得尤为重要。近年来&#xff0c;随着机器视觉技术的飞速发展&a…

2024年【焊工(初级)】考试题及焊工(初级)报名考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;考试题考前必练&#xff01;安全生产模拟考试一点通每个月更新焊工&#xff08;初级&#xff09;报名考试题目及答案&#xff01;多做几遍&#xff0c;其实通过焊工&#xff08;初级…

营销枢纽云打造可持续的客户关系管理:从销售驱动到公司数字资产增值

激烈的市场竞争中&#xff0c;销售驱动的企业往往更依赖关系型销售人员来获取和维护客户资源。但是&#xff0c;随着人才流动性的增强&#xff0c;确保这些客户数据资产不会随销售的个人离职而流失&#xff0c;是现阶段企业所面临的一大挑战。那么&#xff0c;我们如何将销售团…

错过后悔的三大热门婴儿洗衣机总结,希亦、RUUFFY、觉飞谁更值得?

如果将宝宝衣物和大人的衣服一起放进到家用的普通洗衣机里面一起清洗的话&#xff0c;会让宝宝的衣物会沾染上大人身上的各种有害的细菌&#xff0c;而且宝宝的洗涤剂和大人的一般都不同&#xff0c;一般都要用更温和的洗涤剂&#xff0c;和大人用一样的洗涤剂放洗衣机里面搅&a…

word批量修改表格样式

利用宏&#xff0c;批量选中表格&#xff0c;然后利用段落和表设计来操作。 利用宏&#xff0c;批量选中表格&#xff0c;参考百度安全验证段落&#xff0c;表格里面的内容有空格&#xff0c;应该是有缩进&#xff0c;在段落中去掉缩进&#xff0c;即缩进-特殊&#xff0c;选择…

[C++][算法基础]最大公约数(欧几里得算法)

给定 n 对正整数 ,&#xff0c;请你求出每对数的最大公约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数对 ,。 输出格式 输出共 n 行&#xff0c;每行输出一个整数对的最大公约数。 数据范围 1≤n≤, 1≤,≤2 输入样例&#xff1a; 2 3 …

汽车视频智能剪辑解决方案,满足用户对高品质汽车视频的追求

随着汽车智能化和互联网技术的快速发展&#xff0c;车载视频已经成为现代驾驶生活不可或缺的一部分。然而面对海量的行车视频&#xff0c;如何高效地剪辑、整理并分享这些精彩瞬间&#xff0c;一直是车主和汽车内容创作者们所面临的难题。美摄科技&#xff0c;作为领先的视频智…

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中&#xff0c;如果只是做一个简单的单元测试&#xff08;不涉及端到端、数据库交互、API调用、消息队列处理等&#xff09;&#xff0c;我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

这些年背过的面试题--MySQL篇

MySQL一直是面试中的热点问题&#xff0c;也难道了很多的面试者。其实MySQL没那么难&#xff0c;只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏向底层的知识。 本手册&#xff0c;已总结成完整的PDF文档。想获取该文档&am…

C++继承(全)

目录 继承 1.继承定义 2.继承方式和访问限定符 3.继承基类成员后&#xff0c;派生类相应的访问方式的变化 4.基类和派生类的对象赋值转换 1.切片或切割 2.赋值兼容 5.作用域 6.隐藏/重定义 派生类的默认成员函数 1.构造函数 2.拷贝构造函数 3.赋值运算符重载 4.析…

怎么查苹果手机激活时间?立即get这3个方法

苹果手机的激活时间能帮助我们了解手机的购买时间和使用历史&#xff0c;对于二手交易也是一个重要的参考。然而&#xff0c;许多人可能不知道如何查看手机的激活时间。怎么查苹果手机激活时间&#xff1f;在本文中&#xff0c;我们将介绍三种简单而有效的方法&#xff0c;让您…

ros1 C++ 输出helloworld

1、创建工作空间并初始化 mkdir -p 自定义空间名称/src cd 自定义空间名称 catkin_make运行完&#xff0c;生成文件如下图&#xff1a; 2、进入 src 创建 ros 包并添加依赖 cd src catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs这里&#xff0c;我的自定义ROS包名…

回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量…

现在开自助棋牌室,小心租房“陷阱”

之前分享了开自助棋牌室的市场调研流程&#xff0c;那就顺着开店步骤&#xff0c;我将每个环节细化干什么&#xff0c;做成笔记分享给小伙伴们&#xff01; 棋牌室大家在租房的时候&#xff0c;一定要注意以下这些地方&#xff0c;都是我们开了2家店之后&#xff0c;总结的血泪…

刚找到工作,碰到新项目,怎么入手?

之前有特训营老铁说&#xff0c;刚找到工作&#xff0c;碰到了新项目&#xff0c;没有头绪&#xff0c;该怎么入手&#xff1f; 10几年前&#xff0c;我刚入职单片机开发时&#xff0c;也慌得一批&#xff0c;在此之前&#xff0c;我只懂51单片机&#xff0c;玩过智能小车。 好…

SQLAIchemy 异步DBManager封装-01入门理解

前言 SQLAlchemy 是一个强大的 Python SQL 工具包和对象关系映射&#xff08;ORM&#xff09;系统&#xff0c;是业内比较流行的ORM&#xff0c;设计非常优雅。随着其2.0版本的发布&#xff0c;SQLAlchemy 引入了原生的异步支持&#xff0c;这极大地增强了其在处理高并发和异步…

codeforce #925 (div3) 题解

D. Divisible Pairs 给出数组 a a a&#xff0c;如果二元组 ( i , j ) (i,j) (i,j)满足 a i a j m o d x 0 & & a i − a j m o d y 0 a_i a_j mod x 0 \&\& a_i - a_j mod y 0 ai​aj​modx0&&ai​−aj​mody0&#xff0c;则beauty。其中 i &…

阿里云服务器项目部署docker-compose+vue+redis+nginx+minio+springboot

1 阿里云服务器项目部署-单机部署 docker-compose 1.1 搭建背景 服务器 阿里云服务器 前端 vue 后端 springboot 服务 redis 、nginx、minio 都做单机模式部署,不做集群部署 博客内容参考了其他博文&#xff0c;会贴出来 1.2 <重要>端口开放前提说明 任何开放的端…

2024年华中杯数学建模竞赛全攻略:ABC题思路解析+代码实现+数据集+论文撰写+全程答疑

引言 &#xff08;比赛后所有题目资料在文末获取呀&#xff09; 华中杯数学建模竞赛是数学建模领域的一项重要赛事&#xff0c;它不仅考验参赛者的数学建模能力&#xff0c;还考验了编程技能、数据分析能力和论文撰写能力。为了帮助参赛者更好地准备2024年的竞赛&#xff0c;本…