Kafka Producer Retries Idempotence 原理

news2025/7/13 10:54:48

Kafka Producer Retries & Idempotence 原理

由于存在网络瞬时抖动;或者kafka集群短暂的不可用,会导致kafka producer发送消息出现异常,生产者无法将消息推送到topic,在这种情况下,消息丢失的可能性很高。因此kafka设计了一套重试机制,来确保在一定的条件下,系统使用重试策略,重新自动发送消息。今天来学习下kafka 生产者重试机制以及重试机制带来的问题。

重试机制

kafka生产者发送消息至服务端-broker时,broker返回成功或失败,表示该消息是否投递成功。成功返回不必多说,broker返回的错误分为两大类:

  • Retriable errors

    可重试错误 - 重试后可以解决的错误,如broker返回NotEnoughReplicasException异常,则允许生产者重发消息,也许下一秒broker副本在线之后,消息投递成功。

  • Nonretriable error

    不可重试错误 - 即无法解决的错误,如broker返回INVALID_CONFIG异常,kafka 生产者再次尝试发送请求也不会更改请求的结果,broker还是返回错误。

开启重试

默认情况下,Kafka Producer 生产者关闭重试功能,需要开发者手动配置重试策略,代码非常简单:

Properties props = new Properties();

props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");
//重试次数
props.put(ProducerConfig.RETRIES_CONFIG, Integer.toString(Integer.MAX_VALUE));
props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "5");

重试次数

retries 设置决定生产者投递消息失败之后,重试的次数。不同的版本重试的默认值并不一致:

  • 0 - kafka 版本 <= 2.0
  • MAX_INTEGER - Kafka版本 >= 2.1时, Integer 类型最大值 - 2147483647

通常情况下,开发者不用设置此配置,而是使用 delivery.timeout.ms控制重试行为

delivery.timeout.ms

如果 retries > 0,例如 retries = 2147483647,生产者不会永远不会进行请求重试,因为它还受到超时时间的限制。

例如,你将Producer的超时时间设置为 delivery.timeout.ms=120000 ( 2 分钟). 消息无法在2分钟之内投递成功则认为失败(注意:此处包含消息重试). 也就是2分钟之内无论消息投递多少次,如果还没有投递成功,则认为失败。delivery.timeout.ms的时间配置包含了好几个部分,在使用时需要特注意,如下图:

在这里插入图片描述

retry.backoff.ms

默认情况下,生产者将在重试之间会停顿等待100ms,开发者可使用retry.backoff.ms参数来控制这一点。

max.in.flight.requests.per.connection

该参数的默认值为5,在该参数值不为1的情况下进行重试,可能会改变消息的顺序。如将两个批次发送到单个分区,并且第一个批次失败并重试,但第二个批次成功,则第二个批中的记录可能会首先出现。如果应用程序对消息顺序有严格要求,请将该参数位置为1.即max.in.flight.requests.perconnection=1,Kafka保证将在某些消息需要多次重试才能成功确认的情况下保留消息顺序。

幂等性

失败消息重试可能会存在数据重复的问题,即两个消息都被成功写入broker,从而导致重复。引发该现象的大概步骤如下:

  1. 生产者发送消息至broker
  2. 消息被成功写入leader、replicated节点
  3. 可能存在瞬时的网络抖动问题,导致生产者并没有接收到服务器发出的ACK
  4. 生产者重新发送消息 而且收到broker的ack
  5. 这种场景下,broker 收到了2条一模一样的消息

成功 VS 重试的流程图如下

在这里插入图片描述

生产幂等性

生产者幂等性机制确保不会因消息重试而出现业务重复消息

在这里插入图片描述

实现原理

当enable.idempotence设置为true时,每个生产者都会被分配一个生产者Id(PID)。每次发送消息时都会携带PID,此外还会附加一个单调递增的序列号,该序列号跟消息待发送的分区存在一一对应的关系(可以简单理解为map结构Key、Value键值对;分区partition为key,序列号为值)。当broker收到重试的消息,由于该分区对应的最后消息的序列号大于、等于新消息序列化,broker拒绝写入,从而实现消息的幂等性。

但是需要注意,这种机制存在很大的缺陷:原因是每个producer的PID在初始化时自动分配,因此只能保证单个生产者的EOS(精确一次)语义,不保证全局消息的幂等性。

开启幂等性

如果已经配置acks=all,那么应该启用幂等性功能。开启的方式也很简单,只需使用生产者配置 enable.idempotence = true。

Properties props = new Properties();

props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
// 打开幂等性机制
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");

官方建议,通常情况下应当开启 kafka producer 幂等性功能。

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

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

相关文章

全排列思路

目录 省流版结论 推导过程 输出结果&#xff08;元素数量为4时&#xff09; 省流版结论 &#xff08;程序来源&#xff1a;排列组合之——全排列&#xff08;c语言&#xff09;_rewrite!的博客-CSDN博客_全排列&#xff09; 一晚上的时间&#xff0c;终于弄懂了。真羡慕计算…

基于标志点特征高精提取与匹配方法,进行双目、结构光、RGBD相机、单目相机多视拼接

1. 工作原理 人工张贴标志点变换位置拍照相邻照片的公共视野内有相同的标志点群匹配两张照片对应标志点对通过三对以上标志点对&#xff0c;实现两张照片间的坐标变换求解 2.标志点特征 圆形 分类&#xff1a; 编码&#xff08;粘贴于被测物体表面&#xff09;&#xff1a;…

SpringBoot文件上传(官方案例)

在线文档项目结构 1.源码克隆&#xff1a;git clone https://github.com/spring-guides/gs-uploading-files.git 2.包含两个项目initial和complete&#xff0c;initial可以根据文档练习完善&#xff0c;complete是完整项目 3.功能描述&#xff1a;构建接受文件上传的应用程序&a…

转行人必看:数字IC前端设计学习路线与方法(内附学习视频)

众所周知&#xff0c;数字前端设计对于工程师的能力要求比较高&#xff0c;不仅有学历上的要求&#xff0c;还要求掌握很多的知识技能。不少跨专业想要转行的小伙伴对数字前端设计这个岗位不是很了解&#xff0c;下面IC修真院就带大家全面了解一下数字IC前端设计。 数字前端到…

酒水销售网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;网站介绍、帮助信息、酒水资讯、酒水类型、酒水信息、购物分享 管理员&#xff1a; 1、管理网站介…

matlab源码说明

目录 1.MATLAB概述 2.MATLAB程序使用几个常规注意实现 2.1.运行过程可能出现Out of Memory的问题解决办法 2.2.保存大于2G的数据 2.3.程序运行方法 1.MATLAB概述 Matlab经过不断的发展和完善,如今已成为覆盖多个学科,是具有超强数值计算能力和仿真分析能力的软件。…

YOLOv5s.yaml文件解读

目录一、YOLOv5s.yaml内容二、详解2.1参数配置2.2 anchors2.3 backbone2.4 head三、如何调整模型一、YOLOv5s.yaml内容 YOLOv5配置了4种不同大小的网络模型&#xff0c;分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x&#xff0c;其中YOLOv5s是网络深度和宽度最小但检测速度最快的…

资深车主才会告诉你的那些事,看完立省三万二

自动驾驶已经火了几年了。在某度一搜“自动驾驶”&#xff0c;全都是某某公司推出了自动驾驶&#xff0c;某某公司打算推出自动驾驶。当然&#xff0c;这两年因为各种事故的原因&#xff0c;“自动驾驶”被各种名词取代——辅助驾驶、高级辅助驾驶、领航辅助驾驶......这就有点…

以英雄之名为S9总决赛助攻! 虎牙直播and华为云CDN,team work才会赢

以英雄之名为S9总决赛助攻! 虎牙直播and华为云CDN&#xff0c;team work才会赢 你的朋友圈肯定经历过这样一波刷屏 啊啊!!!赢了祝贺!#FPX团灭G2#FPX夺冠啦!超帅超酷超级棒!我们是冠军!!!恭喜FPX!凤凰涅槃!FPX咋这么稳!实在太稳了!小凤凰一飞冲天 团灭!就两个字 就是感觉很厉害…

SimpleAdapter的简单使用

SimpleAdapter适配器的简单使用 1.SimpleAdapter 1.简介 显示复杂的列表项&#xff0c;如图片2.SimpleAdapter的构造函数 上下文数据&#xff08;保存map的list集合&#xff09;子布局key子布局中的id注意&#xff1a;key和id是一一对应的关系 3.SimpleAdapter案例-用户简介 3.…

Java面试常用,初级到高级(持续更新中....)

文章目录一、java基础1、基本类型2、String相关3、数组和list相互转换4、java中的锁5、常用的算法二、项目层面1、并发与并行的区别三、常见错误解决1、Java ConcurrentModificationException异常原因和解决方法2、 main中不能使用this四、底层的相关技术1、spring如何处理循环…

54.Python的def语句自定义函数

54.def语句自定义函数 文章目录54.def语句自定义函数1.课题导入—数学中的函数1.1 计算圆的面积1.2 计算不规则图形的面积2. 什么是函数3. 函数分类3.1 内置函数3.2 自定义函数4. 计算多个矩形的面积5. 自定义函数计算矩形的面积6.自定义函数的写法1.先写函数要实现的功能2.添加…

Android设计模式详解之策略模式

前言 定义&#xff1a;定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 使用场景&#xff1a; 针对同一类型问题的多种处理方式&#xff0c;仅仅是具体行为有差别时&#xff1b;…

电磁波的达朗贝尔方程 工程电磁场P25

我们有下述两个方程 记住一定是线性介质 称为电磁波的达朗贝尔方程&#xff0c;是两个非齐次方程 我们下面介绍达朗贝尔方程的解 我们就用最简单的场源举例 这个方程可以写成 动态位是r和时间的函数 我们可以在球坐标系下展开成 我们再做一下变换 现在如果在这个微分方程里面…

智牛股_第7章_OAuth2+Spring Security OAuth2+GateWay+Druid+Spring Data JPA

交易平台 - Day 7 文章目录交易平台 - Day 7学习目标第1章 OAUTH2统一认证1. 目标2. 分析3. 讲解3.1 传统登陆认证3.2 单点登陆认证3.3 OAuth2简介3.4 OAuth2角色3.5 OAuth2 协议流程3.6 授权类型3.7 授权码模式流程3.8 简化模式3.9 密码模式3.10 客户端模式3.11 Spring Securi…

分治法算法

目录 一 算法简介 ①算法定义 ②算法特征 ③算法编程 二 算法应用 汉诺塔 问题描述 问题解析 问答解答 快速幂 问题描述 问题解析 问题解答 三 分治思想设计排序算法 步骤解析 归并排序 归并排序的主要操作 归并排序与交换排序 归并算法的应用&#xff1a;逆…

前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)

什么是BFC&#xff1f; 1、块级格式化上下文&#xff0c;web页面可视化css视觉渲染的一部分&#xff0c;是页面中一个独立的渲染区域&#xff1b; 2、用于决定块盒子的布局和浮动相互影响范围的一个区域&#xff0c;可以改变父级元素的渲染规则&#xff1b; 3、无论里面怎么折…

轻松入门基因表达式编程 (GEP)

0 引言 基因表达式编程 GEP (Gene Expression Programming) 是一种基于生物基因结构和功能发明的一种新型自适应演化算法。GEP 是从遗传算法&#xff08;geneticalgorithms ,简称 GAs&#xff09;和遗传程序设计&#xff08;genetic pro2gramming ,简称 GP&#xff09;中发展而…

Android GB∕T 19056-2021 汽车行驶记录仪-定位性能测试

最近在做汽车相关的项目&#xff0c;然后要根据最新发布的新国标接入&#xff0c;我们这边之前没有做过的&#xff0c;我是第一个&#xff0c;好惨啊。远程调试不通&#xff0c;后来还专门到现场进行了测试&#xff0c;来到刚刚转正没几天就开始出差了&#xff0c;命太苦了。 …

前沿系列--Transform架构[架构分析+代码实现]

文章目录前言总体架构总体任务使用输入部分EmbeddingPosition Encodingwhy实现注意部分注意力机制/自注意力掩码作用如何工作形状解释完整实现多头注意力实现Norm处理FeedForward 以及连接编码器解码器中间层组装输出层模型组装总结前言 Transform这玩意的大名我想就不用我多说…