如何系列 如何确保Kafka消息可靠性/防止消息丢失

文章目录

        • Producer
        • Broker
        • Consumer
        • 流程

从Kafka架构来看,理论上仍有消息丢失的可能性,但实际发生的概率极低,只有在所有副本的机器都宕机时才会丢失。

当所有代理(broker)都确认消息时,这并不意味着消息已经存储在磁盘上,而是仍在代理的内存中。这可能成为一个问题,特别是在所有代理服务器同时down的情况下。如果所有代理都位于同一可用区,这种情况更有可能发生,这是最糟糕的设计实践之一。

因此,尽管Kafka的设计大大降低了消息丢失的概率,但完全避免消息丢失是不可能的。

Producer
  • 使用回调通知,不要使用producer.send(msg),而要使用producer.send(msg, callback)。记住,一定要使用带有回调通知的send方法。回调可以帮助你在消息发送失败时捕获异常并进行处理。

    producer.send(new ProducerRecord<>("topic", "key", "value"), new Callback() {
        public void onCompletion(RecordMetadata metadata, Exception exception) {
            if (exception != null) {
                // 处理异常
            }
        }
    });
    
    
  • 设置acks = all。acks是Producer的一个参数,代表了你对“已提交”消息的定义。如果设置成all,则表明所有副本Broker都要接收到消息,该消息才算是“已提交”。这是最高等级的“已提交”定义。

    一旦领导者收到来自同步副本的确认,告诉他们已经复制了消息,它就会将确认发送回生产者。这保证了只要至少一个同步副本保持活动状态,记录就不会丢失。

    props.put("acks", "all");
    
  • 设置重试机制,设置retries为一个较大的值。这里的retries同样是Producer的参数,对应前面提到的Producer自动重试。当出现网络的瞬时抖动时,消息发送可能会失败,此时配置了retries > 0的Producer能够自动重试消息发送,避免消息丢失。

  • 启用幂等性,设置enable.idempotencetrue 来启用幂等生产者。这可以防止重试期间出现重复,确保从生产者的角度来看,消息只传送到代理一次。

  • 设置交付超时时间,设置 delivery.timeout.ms 用于设置所有重试的超时时间。因此,如果 retries 是一个很大的数字,但超时很短,消息传递无论如何都会失败。

    props.put("delivery.timeout.ms", "120000");  // 2分钟
    
Broker
  • 禁用非干净的领导者选举,设置unclean.leader.election.enable = false。这是Broker端的参数,它控制的是哪些Broker有资格竞选分区的Leader。如果一个Broker落后原先的Leader太多,那么它一旦成为新的Leader,必然会造成消息的丢失。故一般都要将该参数设置成false,即不允许这种情况的发生。

    防止落后太多的 Broker 选举为 Leader,从而避免消息丢失。

  • 配置副本数量,设置replication.factor >= 3。这也是Broker端的参数。其实这里想表述的是,最好将消息多保存几份,毕竟目前防止消息丢失的主要机制就是冗余。副本replica总数,包括Leader和Follower

  • 设置最小同步副本数,设置min.insync.replicas > 1。这依然是Broker端参数,控制的是消息至少要被写入到多少个副本才算是“已提交”。设置成大于1可以提升消息持久性。在实际环境中千万不要使用默认值1。min.insync.replicas只有在acks=-1(all)时才生效

  • 确保副本数量大于最小同步副本数,确保replication.factor > min.insync.replicas。如果两者相等,那么只要有一个副本挂机,整个分区就无法正常工作了。我们不仅要改善消息的持久性,防止数据丢失,还要在不降低可用性的基础上完成。

    推荐设置成replication.factor = min.insync.replicas + 1

Consumer
  • 确保消息消费完成再提交。Consumer端有个参数enable.auto.commit,最好把它设置成false,并采用手动提交位移的方式。

维持先消费消息(阅读),再更新位移(书签)的顺序

  • 使用 commitSync ;为了更好的性能,使用 commitAsync ,如果处理和提交之间发生故障,可能会出现重复。
流程

当设置 acks=all 并且生产者调用 send() 方法时,它会等待领导者的确认。一旦领导者收到来自同步副本的确认,并告知它们已经复制了消息,领导者将把确认发送回给生产者。

属性 min.insync.replicas 指定了在领导者向客户端发送确认之前必须确认的最小副本数。如果未达到这个最小值,生产者将抛出异常(例如 NotEnoughReplicasNotEnoughReplicasAfterAppend)。

在典型场景中,如果创建一个复制因子为 3 的主题,并将 min.insync.replicas 设置为 2,并使用 acks=all,这将确保只有在大多数副本都写入成功时生产者才会确认消息提交。

当生产者在设定的 request.timeout.ms 时间内未收到确认时,它将会重新发送消息,间隔时间由 retry.backoff.ms 定义。生产者将根据设定的 retries 次数重试发送失败的消息。

另外,属性 delivery.timeout.ms 定义了调用 send() 后返回成功或失败的时间上限。

在达到最大重试次数后,如果消息仍未能成功记录,或出现其他异常情况,可以考虑将消息保存到其他数据存储。这可以通过在 send() 方法中设置回调来处理,在此类错误情况下会触发回调函数。

这些属性和机制确保了在不同网络和节点故障情况下,Kafka生产者能够尽可能地保证消息的可靠性和最终一致性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

天行健咨询|六西格玛绿带培训是投资未来,还是金钱的“黑洞”?

六西格玛绿带培训&#xff0c;作为一种被众多企业推崇的培训课程&#xff0c;自然成为了众多职场人士关注的焦点。然而&#xff0c;面对培训的高昂费用和时间成本&#xff0c;很多人开始质疑&#xff1a;参加六西格玛绿带培训&#xff0c;到底是投资还是浪费钱&#xff1f;深圳…

前端重点之:Vue+websocket通信详细用法和websocket心跳机制的使用,websocket断开实时监测,websocket实时通信

今年年初找工作,好多gou面试官总喜欢问关于websocket通信的使用方式,此次又用到了,在此做个总结:主要包含websocket的具体使用方法,和重点:(心跳机制的使用),就是主要是前端实时监测websocket是否有断连和数据的处理 在前端开发中,WebSocket 是一种常见的技术,用于…

安华金和—可信数据空间助力公共数据授权运营安全有序开展的实践探索

伴随数字化、网络化和智能化的快速发展&#xff0c;数字经济与实体经济深度融合&#xff0c;数据已然成为经济发展赖以依托的基础性、战略性资源&#xff0c;对社会生产、分配、流通、消费和社会服务管理等各环节产生深刻影响。我国高度重视数字经济发展&#xff0c;将数据列入…

构造函数深入理解

目录 构造函数构造函数体赋值初始化列表初始化列表格式初始化列表的意义以及注意点const修饰的成员变量初始化对象成员具体初始化的地方缺省值存在的意义例子1例子2 初始化与赋值引用成员变量的初始化注意点1注意点2我的疑惑 自定义类型成员初始化例子1例子2例子3例子4 初始化列…

Sentinel链路流控模式失效的解决方法

解决方法 1、在pom.xml中增加sentinel-web-servlet的依赖&#xff0c;我使用的版本是1.7.1 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId> </dependency>2、在项目中添加一个FilterCon…

J-Flash刷机的步骤

1、Keil编译代码&#xff0c;生成文件&#xff1a;E:\automotive\xxx.axf 2、打开"SEGGER J-Flash V7.88k"&#xff0c;配置Project information 3、点击菜单栏中的"File"&#xff0c;open data file&#xff0c;找到所需的xxx.axf文件 4、按快捷键F7进…

Yolov8模型调参大全:超详细解读每一个参数

目录 1. 代码获取方式 2. YOLOv8网络配置 3. Yolov8使用 3.1. CLI 3.2. Python 4.default.yaml文件解读 1. 代码获取方式 Yolov8项目地址&#xff1a;https://github.com/ultralytics/ultralytics 这里就不详细介绍v8了 2. YOLOv8网络配置 # Ultralytics YOLO &…

利用多模态大模型解决旅行商问题

概述 ○ 该研究论文提出了一种利用多模态大型语言模型&#xff08;MLLM&#xff09;的视觉推理能力来解决旅行商问题&#xff08;TSP&#xff09;和多旅行商问题&#xff08;mTSP&#xff09;的新方法。 ○ 传统方法依赖于节点坐标和距离矩阵&#xff0c;而本研究则采用多智能…

ueditor解决无法抓取远程背景图片问题的方法(php)

背景 laravel后台经常有用到编辑器的地方&#xff0c;Dcat使用的一般都是UEditor编辑器。最近项目经理在秀米排版以后&#xff0c;将内容复制到UEditor编辑器保存后发现&#xff0c; 在网站页面中发现图片竟然展示失败。经过浏览器控制台发现&#xff0c;图片的域名还是秀米的…

HMI 的 UI 风格创新无限

HMI 的 UI 风格创新无限

变频器配置V20

变频器控制最好是变频电机&#xff0c;在速度不低的情况下工频电机 改变电机转速&#xff0c;调节扭矩&#xff0c; 变频器 L1 L2 L3 ,R S T 电机输入 uvw 电机输出 FSD 制动电阻 设置步骤 恢复出厂设置 p0010:30 p0970:21p0003:3(设定访问级别) P0003 用户访问级别 0 - 4 1…

cadence symbol修改之一

cdaence virtuoso 复制cell&#xff0c;或者拷贝symbol之后&#xff0c;再次调用的时候&#xff0c;symbol还是跟随原来的cell名字 解决办法 打开对应的symbol 修改partName为 cellName

RK3568驱动指南|第十六篇 SPI-第190章 配置模式下寄存器的配置

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

快团团能屏蔽团员某个人吗?有哪些操作步骤?

在快团团里团长不仅拥有发起团购、管理商品和订单的权利&#xff0c;还具备了一项关键功能——屏蔽特定团员的能力。这一功能确保了团长能够维护良好的社群环境&#xff0c;避免不必要的干扰。以下是屏蔽团员的具体步骤&#xff1a; 1. 登录快团团&#xff1a;首先&#xff0c;…

10 - Python文件编程和异常

文件和异常 在实际开发中&#xff0c;常常需要对程序中的数据进行持久化操作&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;对于这个概念&#xff0c;维基百科上给出…

【Unity 3D角色移动】

【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤&#xff0c;包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码&#xff1a; 步骤1&#xff1a;设置角色的物理属性 角色通常使用Character Co…

学校卫星电子怎么自动校准时间呢

在学校的教室里&#xff0c;卫星电子钟精准地为师生们提供着时间服务&#xff0c;而其自动校准时间的功能令人称奇。那么&#xff0c;学校卫星电子钟是如何实现自动校准时间的呢&#xff1f; 学校卫星电子钟自动校准时间的原理基于卫星导航系统。常见的如北斗卫星导航系统或 GP…

什么地方适合安装自动气象站?

随着科技的不断进步&#xff0c;自动气象站在气象观测、环境监测以及科研教学等领域发挥着越来越重要的作用。 一、科研机构和高校校园 科研机构和高校校园是安装自动气象站的理想场所。这些地方拥有专业的科研团队和丰富的教育资源&#xff0c;可以为气象站的建设和运营提供有…

学生用小台灯什么牌子的好?列举出几款学生用台灯推荐

眼睛是我们感知世界的窗口&#xff0c;但近年来&#xff0c;儿童青少年的视力健康却受到了严重困扰。数据显示&#xff0c;近视问题在儿童群体中呈现出明显的增长趋势&#xff0c;这给他们的学习和生活带来了诸多不便。虽然现代科技的快速发展使得电子产品成为了我们生活中不可…

VMware Workstation桥接模式无法上网

问题背景 我之前创建过一个虚拟机&#xff0c;当时虚拟机的网络模式使用的是桥接模式&#xff0c;配置好了固定ip地址&#xff0c;是可以正常上网的&#xff0c;中间没有做任何网络上面的配置。但是今天再打开这台虚拟机时&#xff0c;发现竟然不能上网了。 物理主机的ip信息配…